home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #9 / Amiga Plus CD - 2004 - No. 09.iso / amigaplus / tools / amigaos4_only / mpega_libmad / mad / layer3.c < prev    next >
C/C++ Source or Header  |  2004-08-03  |  70KB  |  2,699 lines

  1. /*
  2.  * libmad - MPEG audio decoder library
  3.  * Copyright (C) 2000-2004 Underbit Technologies, Inc.
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  * $Id: layer3.c,v 1.43 2004/01/23 09:41:32 rob Exp $
  20.  */
  21.  
  22. # ifdef HAVE_CONFIG_H
  23. #  include "config.h"
  24. # endif
  25.  
  26. # include "global.h"
  27.  
  28. # include <stdlib.h>
  29. # include <string.h>
  30.  
  31. # ifdef HAVE_ASSERT_H
  32. #  include <assert.h>
  33. # endif
  34.  
  35. # ifdef HAVE_LIMITS_H
  36. #  include <limits.h>
  37. # else
  38. #  define CHAR_BIT  8
  39. # endif
  40.  
  41. # include "fixed.h"
  42. # include "bit.h"
  43. # include "stream.h"
  44. # include "frame.h"
  45. # include "huffman.h"
  46. # include "layer3.h"
  47.  
  48. /* --- Layer III ----------------------------------------------------------- */
  49.  
  50. enum {
  51.   count1table_select = 0x01,
  52.   scalefac_scale     = 0x02,
  53.   preflag         = 0x04,
  54.   mixed_block_flag   = 0x08
  55. };
  56.  
  57. enum {
  58.   I_STEREO  = 0x1,
  59.   MS_STEREO = 0x2
  60. };
  61.  
  62. struct sideinfo {
  63.   unsigned int main_data_begin;
  64.   unsigned int private_bits;
  65.  
  66.   unsigned char scfsi[2];
  67.  
  68.   struct granule {
  69.     struct channel {
  70.       /* from side info */
  71.       unsigned short part2_3_length;
  72.       unsigned short big_values;
  73.       unsigned short global_gain;
  74.       unsigned short scalefac_compress;
  75.  
  76.       unsigned char flags;
  77.       unsigned char block_type;
  78.       unsigned char table_select[3];
  79.       unsigned char subblock_gain[3];
  80.       unsigned char region0_count;
  81.       unsigned char region1_count;
  82.  
  83.       /* from main_data */
  84.       unsigned char scalefac[39];    /* scalefac_l and/or scalefac_s */
  85.     } ch[2];
  86.   } gr[2];
  87. };
  88.  
  89. /*
  90.  * scalefactor bit lengths
  91.  * derived from section 2.4.2.7 of ISO/IEC 11172-3
  92.  */
  93. static
  94. struct {
  95.   unsigned char slen1;
  96.   unsigned char slen2;
  97. } const sflen_table[16] = {
  98.   { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 },
  99.   { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 },
  100.   { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 },
  101.   { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 }
  102. };
  103.  
  104. /*
  105.  * number of LSF scalefactor band values
  106.  * derived from section 2.4.3.2 of ISO/IEC 13818-3
  107.  */
  108. static
  109. unsigned char const nsfb_table[6][3][4] = {
  110.   { {  6,  5,  5, 5 },
  111.     {  9,  9,  9, 9 },
  112.     {  6,  9,  9, 9 } },
  113.  
  114.   { {  6,  5,  7, 3 },
  115.     {  9,  9, 12, 6 },
  116.     {  6,  9, 12, 6 } },
  117.  
  118.   { { 11, 10,  0, 0 },
  119.     { 18, 18,  0, 0 },
  120.     { 15, 18,  0, 0 } },
  121.  
  122.   { {  7,  7,  7, 0 },
  123.     { 12, 12, 12, 0 },
  124.     {  6, 15, 12, 0 } },
  125.  
  126.   { {  6,  6,  6, 3 },
  127.     { 12,  9,  9, 6 },
  128.     {  6, 12,  9, 6 } },
  129.  
  130.   { {  8,  8,  5, 0 },
  131.     { 15, 12,  9, 0 },
  132.     {  6, 18,  9, 0 } }
  133. };
  134.  
  135. /*
  136.  * MPEG-1 scalefactor band widths
  137.  * derived from Table B.8 of ISO/IEC 11172-3
  138.  */
  139. static
  140. unsigned char const sfb_48000_long[] = {
  141.    4,  4,  4,  4,  4,  4,  6,  6,  6,   8,  10,
  142.   12, 16, 18, 22, 28, 34, 40, 46, 54,  54, 192
  143. };
  144.  
  145. static
  146. unsigned char const sfb_44100_long[] = {
  147.    4,  4,  4,  4,  4,  4,  6,  6,  8,   8,  10,
  148.   12, 16, 20, 24, 28, 34, 42, 50, 54,  76, 158
  149. };
  150.  
  151. static
  152. unsigned char const sfb_32000_long[] = {
  153.    4,  4,  4,  4,  4,  4,  6,  6,  8,  10,  12,
  154.   16, 20, 24, 30, 38, 46, 56, 68, 84, 102,  26
  155. };
  156.  
  157. static
  158. unsigned char const sfb_48000_short[] = {
  159.    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
  160.    6,  6,  6,  6,  6, 10, 10, 10, 12, 12, 12, 14, 14,
  161.   14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
  162. };
  163.  
  164. static
  165. unsigned char const sfb_44100_short[] = {
  166.    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
  167.    6,  6,  8,  8,  8, 10, 10, 10, 12, 12, 12, 14, 14,
  168.   14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
  169. };
  170.  
  171. static
  172. unsigned char const sfb_32000_short[] = {
  173.    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
  174.    6,  6,  8,  8,  8, 12, 12, 12, 16, 16, 16, 20, 20,
  175.   20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
  176. };
  177.  
  178. static
  179. unsigned char const sfb_48000_mixed[] = {
  180.   /* long */   4,  4,  4,  4,  4,  4,  6,  6,
  181.   /* short */  4,  4,  4,  6,  6,  6,  6,  6,  6, 10,
  182.               10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
  183.               16, 20, 20, 20, 26, 26, 26, 66, 66, 66
  184. };
  185.  
  186. static
  187. unsigned char const sfb_44100_mixed[] = {
  188.   /* long */   4,  4,  4,  4,  4,  4,  6,  6,
  189.   /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 10,
  190.               10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
  191.               18, 22, 22, 22, 30, 30, 30, 56, 56, 56
  192. };
  193.  
  194. static
  195. unsigned char const sfb_32000_mixed[] = {
  196.   /* long */   4,  4,  4,  4,  4,  4,  6,  6,
  197.   /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 12,
  198.               12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
  199.               26, 34, 34, 34, 42, 42, 42, 12, 12, 12
  200. };
  201.  
  202. /*
  203.  * MPEG-2 scalefactor band widths
  204.  * derived from Table B.2 of ISO/IEC 13818-3
  205.  */
  206. static
  207. unsigned char const sfb_24000_long[] = {
  208.    6,  6,  6,  6,  6,  6,  8, 10, 12,  14,  16,
  209.   18, 22, 26, 32, 38, 46, 54, 62, 70,  76,  36
  210. };
  211.  
  212. static
  213. unsigned char const sfb_22050_long[] = {
  214.    6,  6,  6,  6,  6,  6,  8, 10, 12,  14,  16,
  215.   20, 24, 28, 32, 38, 46, 52, 60, 68,  58,  54
  216. };
  217.  
  218. # define sfb_16000_long  sfb_22050_long
  219.  
  220. static
  221. unsigned char const sfb_24000_short[] = {
  222.    4,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,  8,
  223.    8,  8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
  224.   18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
  225. };
  226.  
  227. static
  228. unsigned char const sfb_22050_short[] = {
  229.    4,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,  6,
  230.    6,  6,  8,  8,  8, 10, 10, 10, 14, 14, 14, 18, 18,
  231.   18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
  232. };
  233.  
  234. static
  235. unsigned char const sfb_16000_short[] = {
  236.    4,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,  8,
  237.    8,  8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
  238.   18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
  239. };
  240.  
  241. static
  242. unsigned char const sfb_24000_mixed[] = {
  243.   /* long */   6,  6,  6,  6,  6,  6,
  244.   /* short */  6,  6,  6,  8,  8,  8, 10, 10, 10, 12,
  245.               12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
  246.               24, 32, 32, 32, 44, 44, 44, 12, 12, 12
  247. };
  248.  
  249. static
  250. unsigned char const sfb_22050_mixed[] = {
  251.   /* long */   6,  6,  6,  6,  6,  6,
  252.   /* short */  6,  6,  6,  6,  6,  6,  8,  8,  8, 10,
  253.               10, 10, 14, 14, 14, 18, 18, 18, 26, 26,
  254.               26, 32, 32, 32, 42, 42, 42, 18, 18, 18
  255. };
  256.  
  257. static
  258. unsigned char const sfb_16000_mixed[] = {
  259.   /* long */   6,  6,  6,  6,  6,  6,
  260.   /* short */  6,  6,  6,  8,  8,  8, 10, 10, 10, 12,
  261.               12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
  262.               24, 30, 30, 30, 40, 40, 40, 18, 18, 18
  263. };
  264.  
  265. /*
  266.  * MPEG 2.5 scalefactor band widths
  267.  * derived from public sources
  268.  */
  269. # define sfb_12000_long  sfb_16000_long
  270. # define sfb_11025_long  sfb_12000_long
  271.  
  272. static
  273. unsigned char const sfb_8000_long[] = {
  274.   12, 12, 12, 12, 12, 12, 16, 20, 24,  28,  32,
  275.   40, 48, 56, 64, 76, 90,  2,  2,  2,   2,   2
  276. };
  277.  
  278. # define sfb_12000_short  sfb_16000_short
  279. # define sfb_11025_short  sfb_12000_short
  280.  
  281. static
  282. unsigned char const sfb_8000_short[] = {
  283.    8,  8,  8,  8,  8,  8,  8,  8,  8, 12, 12, 12, 16,
  284.   16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36,
  285.   36,  2,  2,  2,  2,  2,  2,  2,  2,  2, 26, 26, 26
  286. };
  287.  
  288. # define sfb_12000_mixed  sfb_16000_mixed
  289. # define sfb_11025_mixed  sfb_12000_mixed
  290.  
  291. /* the 8000 Hz short block scalefactor bands do not break after
  292.    the first 36 frequency lines, so this is probably wrong */
  293. static
  294. unsigned char const sfb_8000_mixed[] = {
  295.   /* long */  12, 12, 12,
  296.   /* short */  4,  4,  4,  8,  8,  8, 12, 12, 12, 16, 16, 16,
  297.               20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36,
  298.                2,  2,  2,  2,  2,  2,  2,  2,  2, 26, 26, 26
  299. };
  300.  
  301. static
  302. struct {
  303.   unsigned char const *l;
  304.   unsigned char const *s;
  305.   unsigned char const *m;
  306. } const sfbwidth_table[9] = {
  307.   { sfb_48000_long, sfb_48000_short, sfb_48000_mixed },
  308.   { sfb_44100_long, sfb_44100_short, sfb_44100_mixed },
  309.   { sfb_32000_long, sfb_32000_short, sfb_32000_mixed },
  310.   { sfb_24000_long, sfb_24000_short, sfb_24000_mixed },
  311.   { sfb_22050_long, sfb_22050_short, sfb_22050_mixed },
  312.   { sfb_16000_long, sfb_16000_short, sfb_16000_mixed },
  313.   { sfb_12000_long, sfb_12000_short, sfb_12000_mixed },
  314.   { sfb_11025_long, sfb_11025_short, sfb_11025_mixed },
  315.   {  sfb_8000_long,  sfb_8000_short,  sfb_8000_mixed }
  316. };
  317.  
  318. /*
  319.  * scalefactor band preemphasis (used only when preflag is set)
  320.  * derived from Table B.6 of ISO/IEC 11172-3
  321.  */
  322. static
  323. unsigned char const pretab[22] = {
  324.   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
  325. };
  326.  
  327. /*
  328.  * table for requantization
  329.  *
  330.  * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
  331.  */
  332. static
  333. struct fixedfloat {
  334.   unsigned long mantissa  : 27;
  335.   unsigned short exponent :  5;
  336. } const rq_table[8207] = {
  337. # include "rq_table.dat"
  338. };
  339.  
  340. /*
  341.  * fractional powers of two
  342.  * used for requantization and joint stereo decoding
  343.  *
  344.  * root_table[3 + x] = 2^(x/4)
  345.  */
  346. static
  347. mad_fixed_t const root_table[7] = {
  348.   MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */,
  349.   MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */,
  350.   MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */,
  351.   MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */,
  352.   MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */,
  353.   MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */,
  354.   MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */
  355. };
  356.  
  357. /*
  358.  * coefficients for aliasing reduction
  359.  * derived from Table B.9 of ISO/IEC 11172-3
  360.  *
  361.  *  c[]  = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }
  362.  * cs[i] =    1 / sqrt(1 + c[i]^2)
  363.  * ca[i] = c[i] / sqrt(1 + c[i]^2)
  364.  */
  365. static
  366. mad_fixed_t const cs[8] = {
  367.   +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */,
  368.   +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */,
  369.   +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */,
  370.   +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */
  371. };
  372.  
  373. static
  374. mad_fixed_t const ca[8] = {
  375.   -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */,
  376.   -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */,
  377.   -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */,
  378.   -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */
  379. };
  380.  
  381. /*
  382.  * IMDCT coefficients for short blocks
  383.  * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3
  384.  *
  385.  * imdct_s[i/even][k] = cos((PI / 24) * (2 *       (i / 2) + 7) * (2 * k + 1))
  386.  * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1))
  387.  */
  388. static
  389. mad_fixed_t const imdct_s[6][6] = {
  390. # include "imdct_s.dat"
  391. };
  392.  
  393. # if !defined(ASO_IMDCT)
  394. /*
  395.  * windowing coefficients for long blocks
  396.  * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
  397.  *
  398.  * window_l[i] = sin((PI / 36) * (i + 1/2))
  399.  */
  400. static
  401. mad_fixed_t const window_l[36] = {
  402.   MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
  403.   MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */,
  404.   MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */,
  405.   MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
  406.   MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */,
  407.   MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */,
  408.  
  409.   MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
  410.   MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */,
  411.   MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */,
  412.   MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
  413.   MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */,
  414.   MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */,
  415.  
  416.   MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */,
  417.   MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */,
  418.   MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */,
  419.   MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */,
  420.   MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */,
  421.   MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */,
  422. };
  423. # endif  /* ASO_IMDCT */
  424.  
  425. /*
  426.  * windowing coefficients for short blocks
  427.  * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
  428.  *
  429.  * window_s[i] = sin((PI / 12) * (i + 1/2))
  430.  */
  431. static
  432. mad_fixed_t const window_s[12] = {
  433.   MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */,
  434.   MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */,
  435.   MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
  436.   MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
  437.   MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
  438.   MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
  439. };
  440.  
  441. /*
  442.  * coefficients for intensity stereo processing
  443.  * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
  444.  *
  445.  * is_ratio[i] = tan(i * (PI / 12))
  446.  * is_table[i] = is_ratio[i] / (1 + is_ratio[i])
  447.  */
  448. static
  449. mad_fixed_t const is_table[7] = {
  450.   MAD_F(0x00000000) /* 0.000000000 */,
  451.   MAD_F(0x0361962f) /* 0.211324865 */,
  452.   MAD_F(0x05db3d74) /* 0.366025404 */,
  453.   MAD_F(0x08000000) /* 0.500000000 */,
  454.   MAD_F(0x0a24c28c) /* 0.633974596 */,
  455.   MAD_F(0x0c9e69d1) /* 0.788675135 */,
  456.   MAD_F(0x10000000) /* 1.000000000 */
  457. };
  458.  
  459. /*
  460.  * coefficients for LSF intensity stereo processing
  461.  * derived from section 2.4.3.2 of ISO/IEC 13818-3
  462.  *
  463.  * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
  464.  * is_lsf_table[1][i] = (1 /      sqrt(2)) ^(i + 1)
  465.  */
  466. static
  467. mad_fixed_t const is_lsf_table[2][15] = {
  468.   {
  469.     MAD_F(0x0d744fcd) /* 0.840896415 */,
  470.     MAD_F(0x0b504f33) /* 0.707106781 */,
  471.     MAD_F(0x09837f05) /* 0.594603558 */,
  472.     MAD_F(0x08000000) /* 0.500000000 */,
  473.     MAD_F(0x06ba27e6) /* 0.420448208 */,
  474.     MAD_F(0x05a8279a) /* 0.353553391 */,
  475.     MAD_F(0x04c1bf83) /* 0.297301779 */,
  476.     MAD_F(0x04000000) /* 0.250000000 */,
  477.     MAD_F(0x035d13f3) /* 0.210224104 */,
  478.     MAD_F(0x02d413cd) /* 0.176776695 */,
  479.     MAD_F(0x0260dfc1) /* 0.148650889 */,
  480.     MAD_F(0x02000000) /* 0.125000000 */,
  481.     MAD_F(0x01ae89fa) /* 0.105112052 */,
  482.     MAD_F(0x016a09e6) /* 0.088388348 */,
  483.     MAD_F(0x01306fe1) /* 0.074325445 */
  484.   }, {
  485.     MAD_F(0x0b504f33) /* 0.707106781 */,
  486.     MAD_F(0x08000000) /* 0.500000000 */,
  487.     MAD_F(0x05a8279a) /* 0.353553391 */,
  488.     MAD_F(0x04000000) /* 0.250000000 */,
  489.     MAD_F(0x02d413cd) /* 0.176776695 */,
  490.     MAD_F(0x02000000) /* 0.125000000 */,
  491.     MAD_F(0x016a09e6) /* 0.088388348 */,
  492.     MAD_F(0x01000000) /* 0.062500000 */,
  493.     MAD_F(0x00b504f3) /* 0.044194174 */,
  494.     MAD_F(0x00800000) /* 0.031250000 */,
  495.     MAD_F(0x005a827a) /* 0.022097087 */,
  496.     MAD_F(0x00400000) /* 0.015625000 */,
  497.     MAD_F(0x002d413d) /* 0.011048543 */,
  498.     MAD_F(0x00200000) /* 0.007812500 */,
  499.     MAD_F(0x0016a09e) /* 0.005524272 */
  500.   }
  501. };
  502.  
  503. /*
  504.  * NAME:    III_sideinfo()
  505.  * DESCRIPTION:    decode frame side information from a bitstream
  506.  */
  507. static
  508. enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
  509.                 int lsf, struct sideinfo *si,
  510.                 unsigned int *data_bitlen,
  511.                 unsigned int *priv_bitlen)
  512. {
  513.   unsigned int ngr, gr, ch, i;
  514.   enum mad_error result = MAD_ERROR_NONE;
  515.  
  516.   *data_bitlen = 0;
  517.   *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
  518.  
  519.   si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9);
  520.   si->private_bits    = mad_bit_read(ptr, *priv_bitlen);
  521.  
  522.   ngr = 1;
  523.   if (!lsf) {
  524.     ngr = 2;
  525.  
  526.     for (ch = 0; ch < nch; ++ch)
  527.       si->scfsi[ch] = mad_bit_read(ptr, 4);
  528.   }
  529.  
  530.   for (gr = 0; gr < ngr; ++gr) {
  531.     struct granule *granule = &si->gr[gr];
  532.  
  533.     for (ch = 0; ch < nch; ++ch) {
  534.       struct channel *channel = &granule->ch[ch];
  535.  
  536.       channel->part2_3_length    = mad_bit_read(ptr, 12);
  537.       channel->big_values        = mad_bit_read(ptr, 9);
  538.       channel->global_gain       = mad_bit_read(ptr, 8);
  539.       channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4);
  540.  
  541.       *data_bitlen += channel->part2_3_length;
  542.  
  543.       if (channel->big_values > 288 && result == 0)
  544.     result = MAD_ERROR_BADBIGVALUES;
  545.  
  546.       channel->flags = 0;
  547.  
  548.       /* window_switching_flag */
  549.       if (mad_bit_read(ptr, 1)) {
  550.     channel->block_type = mad_bit_read(ptr, 2);
  551.  
  552.     if (channel->block_type == 0 && result == 0)
  553.       result = MAD_ERROR_BADBLOCKTYPE;
  554.  
  555.     if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0)
  556.       result = MAD_ERROR_BADSCFSI;
  557.  
  558.     channel->region0_count = 7;
  559.     channel->region1_count = 36;
  560.  
  561.     if (mad_bit_read(ptr, 1))
  562.       channel->flags |= mixed_block_flag;
  563.     else if (channel->block_type == 2)
  564.       channel->region0_count = 8;
  565.  
  566.     for (i = 0; i < 2; ++i)
  567.       channel->table_select[i] = mad_bit_read(ptr, 5);
  568.  
  569. # if defined(DEBUG)
  570.     channel->table_select[2] = 4;  /* not used */
  571. # endif
  572.  
  573.     for (i = 0; i < 3; ++i)
  574.       channel->subblock_gain[i] = mad_bit_read(ptr, 3);
  575.       }
  576.       else {
  577.     channel->block_type = 0;
  578.  
  579.     for (i = 0; i < 3; ++i)
  580.       channel->table_select[i] = mad_bit_read(ptr, 5);
  581.  
  582.     channel->region0_count = mad_bit_read(ptr, 4);
  583.     channel->region1_count = mad_bit_read(ptr, 3);
  584.       }
  585.  
  586.       /* [preflag,] scalefac_scale, count1table_select */
  587.       channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3);
  588.     }
  589.   }
  590.  
  591.   return result;
  592. }
  593.  
  594. /*
  595.  * NAME:    III_scalefactors_lsf()
  596.  * DESCRIPTION:    decode channel scalefactors for LSF from a bitstream
  597.  */
  598. static
  599. unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
  600.                   struct channel *channel,
  601.                   struct channel *gr1ch, int mode_extension)
  602. {
  603.   struct mad_bitptr start;
  604.   unsigned int scalefac_compress, index, slen[4], part, n, i;
  605.   unsigned char const *nsfb;
  606.  
  607.   start = *ptr;
  608.  
  609.   scalefac_compress = channel->scalefac_compress;
  610.   index = (channel->block_type == 2) ?
  611.     ((channel->flags & mixed_block_flag) ? 2 : 1) : 0;
  612.  
  613.   if (!((mode_extension & I_STEREO) && gr1ch)) {
  614.     if (scalefac_compress < 400) {
  615.       slen[0] = (scalefac_compress >> 4) / 5;
  616.       slen[1] = (scalefac_compress >> 4) % 5;
  617.       slen[2] = (scalefac_compress % 16) >> 2;
  618.       slen[3] =  scalefac_compress %  4;
  619.  
  620.       nsfb = nsfb_table[0][index];
  621.     }
  622.     else if (scalefac_compress < 500) {
  623.       scalefac_compress -= 400;
  624.  
  625.       slen[0] = (scalefac_compress >> 2) / 5;
  626.       slen[1] = (scalefac_compress >> 2) % 5;
  627.       slen[2] =  scalefac_compress %  4;
  628.       slen[3] = 0;
  629.  
  630.       nsfb = nsfb_table[1][index];
  631.     }
  632.     else {
  633.       scalefac_compress -= 500;
  634.  
  635.       slen[0] = scalefac_compress / 3;
  636.       slen[1] = scalefac_compress % 3;
  637.       slen[2] = 0;
  638.       slen[3] = 0;
  639.  
  640.       channel->flags |= preflag;
  641.  
  642.       nsfb = nsfb_table[2][index];
  643.     }
  644.  
  645.     n = 0;
  646.     for (part = 0; part < 4; ++part) {
  647.       for (i = 0; i < nsfb[part]; ++i)
  648.     channel->scalefac[n++] = mad_bit_read(ptr, slen[part]);
  649.     }
  650.  
  651.     while (n < 39)
  652.       channel->scalefac[n++] = 0;
  653.   }
  654.   else {  /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */
  655.     scalefac_compress >>= 1;
  656.  
  657.     if (scalefac_compress < 180) {
  658.       slen[0] =  scalefac_compress / 36;
  659.       slen[1] = (scalefac_compress % 36) / 6;
  660.       slen[2] = (scalefac_compress % 36) % 6;
  661.       slen[3] = 0;
  662.  
  663.       nsfb = nsfb_table[3][index];
  664.     }
  665.     else if (scalefac_compress < 244) {
  666.       scalefac_compress -= 180;
  667.  
  668.       slen[0] = (scalefac_compress % 64) >> 4;
  669.       slen[1] = (scalefac_compress % 16) >> 2;
  670.       slen[2] =  scalefac_compress %  4;
  671.       slen[3] = 0;
  672.  
  673.       nsfb = nsfb_table[4][index];
  674.     }
  675.     else {
  676.       scalefac_compress -= 244;
  677.  
  678.       slen[0] = scalefac_compress / 3;
  679.       slen[1] = scalefac_compress % 3;
  680.       slen[2] = 0;
  681.       slen[3] = 0;
  682.  
  683.       nsfb = nsfb_table[5][index];
  684.     }
  685.  
  686.     n = 0;
  687.     for (part = 0; part < 4; ++part) {
  688.       unsigned int max, is_pos;
  689.  
  690.       max = (1 << slen[part]) - 1;
  691.  
  692.       for (i = 0; i < nsfb[part]; ++i) {
  693.     is_pos = mad_bit_read(ptr, slen[part]);
  694.  
  695.     channel->scalefac[n] = is_pos;
  696.     gr1ch->scalefac[n++] = (is_pos == max);
  697.       }
  698.     }
  699.  
  700.     while (n < 39) {
  701.       channel->scalefac[n] = 0;
  702.       gr1ch->scalefac[n++] = 0;  /* apparently not illegal */
  703.     }
  704.   }
  705.  
  706.   return mad_bit_length(&start, ptr);
  707. }
  708.  
  709. /*
  710.  * NAME:    III_scalefactors()
  711.  * DESCRIPTION:    decode channel scalefactors of one granule from a bitstream
  712.  */
  713. static
  714. unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
  715.                   struct channel const *gr0ch, unsigned int scfsi)
  716. {
  717.   struct mad_bitptr start;
  718.   unsigned int slen1, slen2, sfbi;
  719.  
  720.   start = *ptr;
  721.  
  722.   slen1 = sflen_table[channel->scalefac_compress].slen1;
  723.   slen2 = sflen_table[channel->scalefac_compress].slen2;
  724.  
  725.   if (channel->block_type == 2) {
  726.     unsigned int nsfb;
  727.  
  728.     sfbi = 0;
  729.  
  730.     nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
  731.     while (nsfb--)
  732.       channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1);
  733.  
  734.     nsfb = 6 * 3;
  735.     while (nsfb--)
  736.       channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2);
  737.  
  738.     nsfb = 1 * 3;
  739.     while (nsfb--)
  740.       channel->scalefac[sfbi++] = 0;
  741.   }
  742.   else {  /* channel->block_type != 2 */
  743.     if (scfsi & 0x8) {
  744.       for (sfbi = 0; sfbi < 6; ++sfbi)
  745.     channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
  746.     }
  747.     else {
  748.       for (sfbi = 0; sfbi < 6; ++sfbi)
  749.     channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
  750.     }
  751.  
  752.     if (scfsi & 0x4) {
  753.       for (sfbi = 6; sfbi < 11; ++sfbi)
  754.     channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
  755.     }
  756.     else {
  757.       for (sfbi = 6; sfbi < 11; ++sfbi)
  758.     channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
  759.     }
  760.  
  761.     if (scfsi & 0x2) {
  762.       for (sfbi = 11; sfbi < 16; ++sfbi)
  763.     channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
  764.     }
  765.     else {
  766.       for (sfbi = 11; sfbi < 16; ++sfbi)
  767.     channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
  768.     }
  769.  
  770.     if (scfsi & 0x1) {
  771.       for (sfbi = 16; sfbi < 21; ++sfbi)
  772.     channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
  773.     }
  774.     else {
  775.       for (sfbi = 16; sfbi < 21; ++sfbi)
  776.     channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
  777.     }
  778.  
  779.     channel->scalefac[21] = 0;
  780.   }
  781.  
  782.   return mad_bit_length(&start, ptr);
  783. }
  784.  
  785. /*
  786.  * The Layer III formula for requantization and scaling is defined by
  787.  * section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows:
  788.  *
  789.  *   long blocks:
  790.  *   xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
  791.  *           2^((1/4) * (global_gain - 210)) *
  792.  *           2^-(scalefac_multiplier *
  793.  *               (scalefac_l[sfb] + preflag * pretab[sfb]))
  794.  *
  795.  *   short blocks:
  796.  *   xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
  797.  *           2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) *
  798.  *           2^-(scalefac_multiplier * scalefac_s[sfb][w])
  799.  *
  800.  *   where:
  801.  *   scalefac_multiplier = (scalefac_scale + 1) / 2
  802.  *
  803.  * The routines III_exponents() and III_requantize() facilitate this
  804.  * calculation.
  805.  */
  806.  
  807. /*
  808.  * NAME:    III_exponents()
  809.  * DESCRIPTION:    calculate scalefactor exponents
  810.  */
  811. static
  812. void III_exponents(struct channel const *channel,
  813.            unsigned char const *sfbwidth, signed int exponents[39])
  814. {
  815.   signed int gain;
  816.   unsigned int scalefac_multiplier, sfbi;
  817.  
  818.   gain = (signed int) channel->global_gain - 210;
  819.   scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1;
  820.  
  821.   if (channel->block_type == 2) {
  822.     unsigned int l;
  823.     signed int gain0, gain1, gain2;
  824.  
  825.     sfbi = l = 0;
  826.  
  827.     if (channel->flags & mixed_block_flag) {
  828.       unsigned int premask;
  829.  
  830.       premask = (channel->flags & preflag) ? ~0 : 0;
  831.  
  832.       /* long block subbands 0-1 */
  833.  
  834.       while (l < 36) {
  835.     exponents[sfbi] = gain -
  836.       (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) <<
  837.             scalefac_multiplier);
  838.  
  839.     l += sfbwidth[sfbi++];
  840.       }
  841.     }
  842.  
  843.     /* this is probably wrong for 8000 Hz short/mixed blocks */
  844.  
  845.     gain0 = gain - 8 * (signed int) channel->subblock_gain[0];
  846.     gain1 = gain - 8 * (signed int) channel->subblock_gain[1];
  847.     gain2 = gain - 8 * (signed int) channel->subblock_gain[2];
  848.  
  849.     while (l < 576) {
  850.       exponents[sfbi + 0] = gain0 -
  851.     (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier);
  852.       exponents[sfbi + 1] = gain1 -
  853.     (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier);
  854.       exponents[sfbi + 2] = gain2 -
  855.     (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier);
  856.  
  857.       l    += 3 * sfbwidth[sfbi];
  858.       sfbi += 3;
  859.     }
  860.   }
  861.   else {  /* channel->block_type != 2 */
  862.     if (channel->flags & preflag) {
  863.       for (sfbi = 0; sfbi < 22; ++sfbi) {
  864.     exponents[sfbi] = gain -
  865.       (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) <<
  866.             scalefac_multiplier);
  867.       }
  868.     }
  869.     else {
  870.       for (sfbi = 0; sfbi < 22; ++sfbi) {
  871.     exponents[sfbi] = gain -
  872.       (signed int) (channel->scalefac[sfbi] << scalefac_multiplier);
  873.       }
  874.     }
  875.   }
  876. }
  877.  
  878. /*
  879.  * NAME:    III_requantize()
  880.  * DESCRIPTION:    requantize one (positive) value
  881.  */
  882. static
  883. mad_fixed_t III_requantize(unsigned int value, signed int exp)
  884. {
  885.   mad_fixed_t requantized;
  886.   signed int frac;
  887.   struct fixedfloat const *power;
  888.  
  889.   frac = exp % 4;  /* assumes sign(frac) == sign(exp) */
  890.   exp /= 4;
  891.  
  892.   power = &rq_table[value];
  893.   requantized = power->mantissa;
  894.   exp += power->exponent;
  895.  
  896.   if (exp < 0) {
  897.     if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) {
  898.       /* underflow */
  899.       requantized = 0;
  900.     }
  901.     else {
  902.       requantized += 1L << (-exp - 1);
  903.       requantized >>= -exp;
  904.     }
  905.   }
  906.   else {
  907.     if (exp >= 5) {
  908.       /* overflow */
  909. # if defined(DEBUG)
  910.       fprintf(stderr, "requantize overflow (%f * 2^%d)\n",
  911.           mad_f_todouble(requantized), exp);
  912. # endif
  913.       requantized = MAD_F_MAX;
  914.     }
  915.     else
  916.       requantized <<= exp;
  917.   }
  918.  
  919.   return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized;
  920. }
  921.  
  922. /* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */
  923. # define MASK(cache, sz, bits)    \
  924.     (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1))
  925. # define MASK1BIT(cache, sz)  \
  926.     ((cache) & (1 << ((sz) - 1)))
  927.  
  928. /*
  929.  * NAME:    III_huffdecode()
  930.  * DESCRIPTION:    decode Huffman code words of one channel of one granule
  931.  */
  932. static
  933. enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
  934.                   struct channel *channel,
  935.                   unsigned char const *sfbwidth,
  936.                   unsigned int part2_length)
  937. {
  938.   signed int exponents[39], exp;
  939.   signed int const *expptr;
  940.   struct mad_bitptr peek;
  941.   signed int bits_left, cachesz;
  942.   register mad_fixed_t *xrptr;
  943.   mad_fixed_t const *sfbound;
  944.   register unsigned long bitcache;
  945.  
  946.   bits_left = (signed) channel->part2_3_length - (signed) part2_length;
  947.   if (bits_left < 0)
  948.     return MAD_ERROR_BADPART3LEN;
  949.  
  950.   III_exponents(channel, sfbwidth, exponents);
  951.  
  952.   peek = *ptr;
  953.   mad_bit_skip(ptr, bits_left);
  954.  
  955.   /* align bit reads to byte boundaries */
  956.   cachesz  = mad_bit_bitsleft(&peek);
  957.   cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
  958.  
  959.   bitcache   = mad_bit_read(&peek, cachesz);
  960.   bits_left -= cachesz;
  961.  
  962.   xrptr = &xr[0];
  963.  
  964.   /* big_values */
  965.   {
  966.     unsigned int region, rcount;
  967.     struct hufftable const *entry;
  968.     union huffpair const *table;
  969.     unsigned int linbits, startbits, big_values, reqhits;
  970.     mad_fixed_t reqcache[16];
  971.  
  972.     sfbound = xrptr + *sfbwidth++;
  973.     rcount  = channel->region0_count + 1;
  974.  
  975.     entry     = &mad_huff_pair_table[channel->table_select[region = 0]];
  976.     table     = entry->table;
  977.     linbits   = entry->linbits;
  978.     startbits = entry->startbits;
  979.  
  980.     if (table == 0)
  981.       return MAD_ERROR_BADHUFFTABLE;
  982.  
  983.     expptr  = &exponents[0];
  984.     exp     = *expptr++;
  985.     reqhits = 0;
  986.  
  987.     big_values = channel->big_values;
  988.  
  989.     while (big_values-- && cachesz + bits_left > 0) {
  990.       union huffpair const *pair;
  991.       unsigned int clumpsz, value;
  992.       register mad_fixed_t requantized;
  993.  
  994.       if (xrptr == sfbound) {
  995.     sfbound += *sfbwidth++;
  996.  
  997.     /* change table if region boundary */
  998.  
  999.     if (--rcount == 0) {
  1000.       if (region == 0)
  1001.         rcount = channel->region1_count + 1;
  1002.       else
  1003.         rcount = 0;  /* all remaining */
  1004.  
  1005.       entry     = &mad_huff_pair_table[channel->table_select[++region]];
  1006.       table     = entry->table;
  1007.       linbits   = entry->linbits;
  1008.       startbits = entry->startbits;
  1009.  
  1010.       if (table == 0)
  1011.         return MAD_ERROR_BADHUFFTABLE;
  1012.     }
  1013.  
  1014.     if (exp != *expptr) {
  1015.       exp = *expptr;
  1016.       reqhits = 0;
  1017.     }
  1018.  
  1019.     ++expptr;
  1020.       }
  1021.  
  1022.       if (cachesz < 21) {
  1023.     unsigned int bits;
  1024.  
  1025.     bits       = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
  1026.     bitcache   = (bitcache << bits) | mad_bit_read(&peek, bits);
  1027.     cachesz   += bits;
  1028.     bits_left -= bits;
  1029.       }
  1030.  
  1031.       /* hcod (0..19) */
  1032.  
  1033.       clumpsz = startbits;
  1034.       pair    = &table[MASK(bitcache, cachesz, clumpsz)];
  1035.  
  1036.       while (!pair->final) {
  1037.     cachesz -= clumpsz;
  1038.  
  1039.     clumpsz = pair->ptr.bits;
  1040.     pair    = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)];
  1041.       }
  1042.  
  1043.       cachesz -= pair->value.hlen;
  1044.  
  1045.       if (linbits) {
  1046.     /* x (0..14) */
  1047.  
  1048.     value = pair->value.x;
  1049.  
  1050.     switch (value) {
  1051.     case 0:
  1052.       xrptr[0] = 0;
  1053.       break;
  1054.  
  1055.     case 15:
  1056.       if (cachesz < linbits + 2) {
  1057.         bitcache   = (bitcache << 16) | mad_bit_read(&peek, 16);
  1058.         cachesz   += 16;
  1059.         bits_left -= 16;
  1060.       }
  1061.  
  1062.       value += MASK(bitcache, cachesz, linbits);
  1063.       cachesz -= linbits;
  1064.  
  1065.       requantized = III_requantize(value, exp);
  1066.       goto x_final;
  1067.  
  1068.     default:
  1069.       if (reqhits & (1 << value))
  1070.         requantized = reqcache[value];
  1071.       else {
  1072.         reqhits |= (1 << value);
  1073.         requantized = reqcache[value] = III_requantize(value, exp);
  1074.       }
  1075.  
  1076.     x_final:
  1077.       xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
  1078.         -requantized : requantized;
  1079.     }
  1080.  
  1081.     /* y (0..14) */
  1082.  
  1083.     value = pair->value.y;
  1084.  
  1085.     switch (value) {
  1086.     case 0:
  1087.       xrptr[1] = 0;
  1088.       break;
  1089.  
  1090.     case 15:
  1091.       if (cachesz < linbits + 1) {
  1092.         bitcache   = (bitcache << 16) | mad_bit_read(&peek, 16);
  1093.         cachesz   += 16;
  1094.         bits_left -= 16;
  1095.       }
  1096.  
  1097.       value += MASK(bitcache, cachesz, linbits);
  1098.       cachesz -= linbits;
  1099.  
  1100.       requantized = III_requantize(value, exp);
  1101.       goto y_final;
  1102.  
  1103.     default:
  1104.       if (reqhits & (1 << value))
  1105.         requantized = reqcache[value];
  1106.       else {
  1107.         reqhits |= (1 << value);
  1108.         requantized = reqcache[value] = III_requantize(value, exp);
  1109.       }
  1110.  
  1111.     y_final:
  1112.       xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
  1113.         -requantized : requantized;
  1114.     }
  1115.       }
  1116.       else {
  1117.     /* x (0..1) */
  1118.  
  1119.     value = pair->value.x;
  1120.  
  1121.     if (value == 0)
  1122.       xrptr[0] = 0;
  1123.     else {
  1124.       if (reqhits & (1 << value))
  1125.         requantized = reqcache[value];
  1126.       else {
  1127.         reqhits |= (1 << value);
  1128.         requantized = reqcache[value] = III_requantize(value, exp);
  1129.       }
  1130.  
  1131.       xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
  1132.         -requantized : requantized;
  1133.     }
  1134.  
  1135.     /* y (0..1) */
  1136.  
  1137.     value = pair->value.y;
  1138.  
  1139.     if (value == 0)
  1140.       xrptr[1] = 0;
  1141.     else {
  1142.       if (reqhits & (1 << value))
  1143.         requantized = reqcache[value];
  1144.       else {
  1145.         reqhits |= (1 << value);
  1146.         requantized = reqcache[value] = III_requantize(value, exp);
  1147.       }
  1148.  
  1149.       xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
  1150.         -requantized : requantized;
  1151.     }
  1152.       }
  1153.  
  1154.       xrptr += 2;
  1155.     }
  1156.   }
  1157.  
  1158.   if (cachesz + bits_left < 0)
  1159.     return MAD_ERROR_BADHUFFDATA;  /* big_values overrun */
  1160.  
  1161.   /* count1 */
  1162.   {
  1163.     union huffquad const *table;
  1164.     register mad_fixed_t requantized;
  1165.  
  1166.     table = mad_huff_quad_table[channel->flags & count1table_select];
  1167.  
  1168.     requantized = III_requantize(1, exp);
  1169.  
  1170.     while (cachesz + bits_left > 0 && xrptr <= &xr[572]) {
  1171.       union huffquad const *quad;
  1172.  
  1173.       /* hcod (1..6) */
  1174.  
  1175.       if (cachesz < 10) {
  1176.     bitcache   = (bitcache << 16) | mad_bit_read(&peek, 16);
  1177.     cachesz   += 16;
  1178.     bits_left -= 16;
  1179.       }
  1180.  
  1181.       quad = &table[MASK(bitcache, cachesz, 4)];
  1182.  
  1183.       /* quad tables guaranteed to have at most one extra lookup */
  1184.       if (!quad->final) {
  1185.     cachesz -= 4;
  1186.  
  1187.     quad = &table[quad->ptr.offset +
  1188.               MASK(bitcache, cachesz, quad->ptr.bits)];
  1189.       }
  1190.  
  1191.       cachesz -= quad->value.hlen;
  1192.  
  1193.       if (xrptr == sfbound) {
  1194.     sfbound += *sfbwidth++;
  1195.  
  1196.     if (exp != *expptr) {
  1197.       exp = *expptr;
  1198.       requantized = III_requantize(1, exp);
  1199.     }
  1200.  
  1201.     ++expptr;
  1202.       }
  1203.  
  1204.       /* v (0..1) */
  1205.  
  1206.       xrptr[0] = quad->value.v ?
  1207.     (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
  1208.  
  1209.       /* w (0..1) */
  1210.  
  1211.       xrptr[1] = quad->value.w ?
  1212.     (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
  1213.  
  1214.       xrptr += 2;
  1215.  
  1216.       if (xrptr == sfbound) {
  1217.     sfbound += *sfbwidth++;
  1218.  
  1219.     if (exp != *expptr) {
  1220.       exp = *expptr;
  1221.       requantized = III_requantize(1, exp);
  1222.     }
  1223.  
  1224.     ++expptr;
  1225.       }
  1226.  
  1227.       /* x (0..1) */
  1228.  
  1229.       xrptr[0] = quad->value.x ?
  1230.     (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
  1231.  
  1232.       /* y (0..1) */
  1233.  
  1234.       xrptr[1] = quad->value.y ?
  1235.     (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
  1236.  
  1237.       xrptr += 2;
  1238.     }
  1239.  
  1240.     if (cachesz + bits_left < 0) {
  1241. # if 0 && defined(DEBUG)
  1242.       fprintf(stderr, "huffman count1 overrun (%d bits)\n",
  1243.           -(cachesz + bits_left));
  1244. # endif
  1245.  
  1246.       /* technically the bitstream is misformatted, but apparently
  1247.      some encoders are just a bit sloppy with stuffing bits */
  1248.  
  1249.       xrptr -= 4;
  1250.     }
  1251.   }
  1252.  
  1253.   assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT);
  1254.  
  1255. # if 0 && defined(DEBUG)
  1256.   if (bits_left < 0)
  1257.     fprintf(stderr, "read %d bits too many\n", -bits_left);
  1258.   else if (cachesz + bits_left > 0)
  1259.     fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left);
  1260. # endif
  1261.  
  1262.   /* rzero */
  1263.   while (xrptr < &xr[576]) {
  1264.     xrptr[0] = 0;
  1265.     xrptr[1] = 0;
  1266.  
  1267.     xrptr += 2;
  1268.   }
  1269.  
  1270.   return MAD_ERROR_NONE;
  1271. }
  1272.  
  1273. # undef MASK
  1274. # undef MASK1BIT
  1275.  
  1276. /*
  1277.  * NAME:    III_reorder()
  1278.  * DESCRIPTION:    reorder frequency lines of a short block into subband order
  1279.  */
  1280. static
  1281. void III_reorder(mad_fixed_t xr[576], struct channel const *channel,
  1282.          unsigned char const sfbwidth[39])
  1283. {
  1284.   mad_fixed_t tmp[32][3][6];
  1285.   unsigned int sb, l, f, w, sbw[3], sw[3];
  1286.  
  1287.   /* this is probably wrong for 8000 Hz mixed blocks */
  1288.  
  1289.   sb = 0;
  1290.   if (channel->flags & mixed_block_flag) {
  1291.     sb = 2;
  1292.  
  1293.     l = 0;
  1294.     while (l < 36)
  1295.       l += *sfbwidth++;
  1296.   }
  1297.  
  1298.   for (w = 0; w < 3; ++w) {
  1299.     sbw[w] = sb;
  1300.     sw[w]  = 0;
  1301.   }
  1302.  
  1303.   f = *sfbwidth++;
  1304.   w = 0;
  1305.  
  1306.   for (l = 18 * sb; l < 576; ++l) {
  1307.     if (f-- == 0) {
  1308.       f = *sfbwidth++ - 1;
  1309.       w = (w + 1) % 3;
  1310.     }
  1311.  
  1312.     tmp[sbw[w]][w][sw[w]++] = xr[l];
  1313.  
  1314.     if (sw[w] == 6) {
  1315.       sw[w] = 0;
  1316.       ++sbw[w];
  1317.     }
  1318.   }
  1319.  
  1320.   bcopy(&tmp[sb], &xr[18 * sb], (576 - 18 * sb) * sizeof(mad_fixed_t));
  1321. }
  1322.  
  1323. /*
  1324.  * NAME:    III_stereo()
  1325.  * DESCRIPTION:    perform joint stereo processing on a granule
  1326.  */
  1327. static
  1328. enum mad_error III_stereo(mad_fixed_t xr[2][576],
  1329.               struct granule const *granule,
  1330.               struct mad_header *header,
  1331.               unsigned char const *sfbwidth)
  1332. {
  1333.   short modes[39];
  1334.   unsigned int sfbi, l, n, i;
  1335.  
  1336.   if (granule->ch[0].block_type !=
  1337.       granule->ch[1].block_type ||
  1338.       (granule->ch[0].flags & mixed_block_flag) !=
  1339.       (granule->ch[1].flags & mixed_block_flag))
  1340.     return MAD_ERROR_BADSTEREO;
  1341.  
  1342.   for (i = 0; i < 39; ++i)
  1343.     modes[i] = header->mode_extension;
  1344.  
  1345.   /* intensity stereo */
  1346.  
  1347.   if (header->mode_extension & I_STEREO) {
  1348.     struct channel const *right_ch = &granule->ch[1];
  1349.     mad_fixed_t const *right_xr = xr[1];
  1350.     unsigned int is_pos;
  1351.  
  1352.     header->flags |= MAD_FLAG_I_STEREO;
  1353.  
  1354.     /* first determine which scalefactor bands are to be processed */
  1355.  
  1356.     if (right_ch->block_type == 2) {
  1357.       unsigned int lower, start, max, bound[3], w;
  1358.  
  1359.       lower = start = max = bound[0] = bound[1] = bound[2] = 0;
  1360.  
  1361.       sfbi = l = 0;
  1362.  
  1363.       if (right_ch->flags & mixed_block_flag) {
  1364.     while (l < 36) {
  1365.       n = sfbwidth[sfbi++];
  1366.  
  1367.       for (i = 0; i < n; ++i) {
  1368.         if (right_xr[i]) {
  1369.           lower = sfbi;
  1370.           break;
  1371.         }
  1372.       }
  1373.  
  1374.       right_xr += n;
  1375.       l += n;
  1376.     }
  1377.  
  1378.     start = sfbi;
  1379.       }
  1380.  
  1381.       w = 0;
  1382.       while (l < 576) {
  1383.     n = sfbwidth[sfbi++];
  1384.  
  1385.     for (i = 0; i < n; ++i) {
  1386.       if (right_xr[i]) {
  1387.         max = bound[w] = sfbi;
  1388.         break;
  1389.       }
  1390.     }
  1391.  
  1392.     right_xr += n;
  1393.     l += n;
  1394.     w = (w + 1) % 3;
  1395.       }
  1396.  
  1397.       if (max)
  1398.     lower = start;
  1399.  
  1400.       /* long blocks */
  1401.  
  1402.       for (i = 0; i < lower; ++i)
  1403.     modes[i] = header->mode_extension & ~I_STEREO;
  1404.  
  1405.       /* short blocks */
  1406.  
  1407.       w = 0;
  1408.       for (i = start; i < max; ++i) {
  1409.     if (i < bound[w])
  1410.       modes[i] = header->mode_extension & ~I_STEREO;
  1411.  
  1412.     w = (w + 1) % 3;
  1413.       }
  1414.     }
  1415.     else {  /* right_ch->block_type != 2 */
  1416.       unsigned int bound;
  1417.  
  1418.       bound = 0;
  1419.       for (sfbi = l = 0; l < 576; l += n) {
  1420.     n = sfbwidth[sfbi++];
  1421.  
  1422.     for (i = 0; i < n; ++i) {
  1423.       if (right_xr[i]) {
  1424.         bound = sfbi;
  1425.         break;
  1426.       }
  1427.     }
  1428.  
  1429.     right_xr += n;
  1430.       }
  1431.  
  1432.       for (i = 0; i < bound; ++i)
  1433.     modes[i] = header->mode_extension & ~I_STEREO;
  1434.     }
  1435.  
  1436.     /* now do the actual processing */
  1437.  
  1438.     if (header->flags & MAD_FLAG_LSF_EXT) {
  1439.       unsigned char const *illegal_pos = granule[1].ch[1].scalefac;
  1440.       mad_fixed_t const *lsf_scale;
  1441.  
  1442.       /* intensity_scale */
  1443.       lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1];
  1444.  
  1445.       for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
  1446.     n = sfbwidth[sfbi];
  1447.  
  1448.     if (!(modes[sfbi] & I_STEREO))
  1449.       continue;
  1450.  
  1451.     if (illegal_pos[sfbi]) {
  1452.       modes[sfbi] &= ~I_STEREO;
  1453.       continue;
  1454.     }
  1455.  
  1456.     is_pos = right_ch->scalefac[sfbi];
  1457.  
  1458.     for (i = 0; i < n; ++i) {
  1459.       register mad_fixed_t left;
  1460.  
  1461.       left = xr[0][l + i];
  1462.  
  1463.       if (is_pos == 0)
  1464.         xr[1][l + i] = left;
  1465.       else {
  1466.         register mad_fixed_t opposite;
  1467.  
  1468.         opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]);
  1469.  
  1470.         if (is_pos & 1) {
  1471.           xr[0][l + i] = opposite;
  1472.           xr[1][l + i] = left;
  1473.         }
  1474.         else
  1475.           xr[1][l + i] = opposite;
  1476.       }
  1477.     }
  1478.       }
  1479.     }
  1480.     else {  /* !(header->flags & MAD_FLAG_LSF_EXT) */
  1481.       for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
  1482.     n = sfbwidth[sfbi];
  1483.  
  1484.     if (!(modes[sfbi] & I_STEREO))
  1485.       continue;
  1486.  
  1487.     is_pos = right_ch->scalefac[sfbi];
  1488.  
  1489.     if (is_pos >= 7) {  /* illegal intensity position */
  1490.       modes[sfbi] &= ~I_STEREO;
  1491.       continue;
  1492.     }
  1493.  
  1494.     for (i = 0; i < n; ++i) {
  1495.       register mad_fixed_t left;
  1496.  
  1497.       left = xr[0][l + i];
  1498.  
  1499.       xr[0][l + i] = mad_f_mul(left, is_table[    is_pos]);
  1500.       xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]);
  1501.     }
  1502.       }
  1503.     }
  1504.   }
  1505.  
  1506.   /* middle/side stereo */
  1507.  
  1508.   if (header->mode_extension & MS_STEREO) {
  1509.     register mad_fixed_t invsqrt2;
  1510.  
  1511.     header->flags |= MAD_FLAG_MS_STEREO;
  1512.  
  1513.     invsqrt2 = root_table[3 + -2];
  1514.  
  1515.     for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
  1516.       n = sfbwidth[sfbi];
  1517.  
  1518.       if (modes[sfbi] != MS_STEREO)
  1519.     continue;
  1520.  
  1521.       for (i = 0; i < n; ++i) {
  1522.     register mad_fixed_t m, s;
  1523.  
  1524.     m = xr[0][l + i];
  1525.     s = xr[1][l + i];
  1526.  
  1527.     xr[0][l + i] = mad_f_mul(m + s, invsqrt2);  /* l = (m + s) / sqrt(2) */
  1528.     xr[1][l + i] = mad_f_mul(m - s, invsqrt2);  /* r = (m - s) / sqrt(2) */
  1529.       }
  1530.     }
  1531.   }
  1532.  
  1533.   return MAD_ERROR_NONE;
  1534. }
  1535.  
  1536. /*
  1537.  * NAME:    III_aliasreduce()
  1538.  * DESCRIPTION:    perform frequency line alias reduction
  1539.  */
  1540. static
  1541. void III_aliasreduce(mad_fixed_t xr[576], int lines)
  1542. {
  1543.   mad_fixed_t const *bound;
  1544.   int i;
  1545.  
  1546.   bound = &xr[lines];
  1547.   for (xr += 18; xr < bound; xr += 18) {
  1548.     for (i = 0; i < 8; ++i) {
  1549.       register mad_fixed_t a, b;
  1550.       register mad_fixed64hi_t hi;
  1551.       register mad_fixed64lo_t lo;
  1552.  
  1553.       a = xr[-1 - i];
  1554.       b = xr[     i];
  1555.  
  1556. # if defined(ASO_ZEROCHECK)
  1557.       if (a | b) {
  1558. # endif
  1559.     MAD_F_ML0(hi, lo,  a, cs[i]);
  1560.     MAD_F_MLA(hi, lo, -b, ca[i]);
  1561.  
  1562.     xr[-1 - i] = MAD_F_MLZ(hi, lo);
  1563.  
  1564.     MAD_F_ML0(hi, lo,  b, cs[i]);
  1565.     MAD_F_MLA(hi, lo,  a, ca[i]);
  1566.  
  1567.     xr[     i] = MAD_F_MLZ(hi, lo);
  1568. # if defined(ASO_ZEROCHECK)
  1569.       }
  1570. # endif
  1571.     }
  1572.   }
  1573. }
  1574.  
  1575. # if defined(ASO_IMDCT)
  1576. void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int);
  1577. # else
  1578. #  if 1
  1579. static
  1580. void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18])
  1581. {
  1582.   mad_fixed_t a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7,  a8,  a9,  a10, a11, a12;
  1583.   mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
  1584.   mad_fixed_t m0,  m1,  m2,  m3,  m4,  m5,  m6,  m7;
  1585.  
  1586.   enum {
  1587.     c0 =  MAD_F(0x1f838b8d),  /* 2 * cos( 1 * PI / 18) */
  1588.     c1 =  MAD_F(0x1bb67ae8),  /* 2 * cos( 3 * PI / 18) */
  1589.     c2 =  MAD_F(0x18836fa3),  /* 2 * cos( 4 * PI / 18) */
  1590.     c3 =  MAD_F(0x1491b752),  /* 2 * cos( 5 * PI / 18) */
  1591.     c4 =  MAD_F(0x0af1d43a),  /* 2 * cos( 7 * PI / 18) */
  1592.     c5 =  MAD_F(0x058e86a0),  /* 2 * cos( 8 * PI / 18) */
  1593.     c6 = -MAD_F(0x1e11f642)   /* 2 * cos(16 * PI / 18) */
  1594.   };
  1595.  
  1596.   a0 = x[3] + x[5];
  1597.   a1 = x[3] - x[5];
  1598.   a2 = x[6] + x[2];
  1599.   a3 = x[6] - x[2];
  1600.   a4 = x[1] + x[7];
  1601.   a5 = x[1] - x[7];
  1602.   a6 = x[8] + x[0];
  1603.   a7 = x[8] - x[0];
  1604.  
  1605.   a8  = a0  + a2;
  1606.   a9  = a0  - a2;
  1607.   a10 = a0  - a6;
  1608.   a11 = a2  - a6;
  1609.   a12 = a8  + a6;
  1610.   a13 = a1  - a3;
  1611.   a14 = a13 + a7;
  1612.   a15 = a3  + a7;
  1613.   a16 = a1  - a7;
  1614.   a17 = a1  + a3;
  1615.  
  1616.   m0 = mad_f_mul(a17, -c3);
  1617.   m1 = mad_f_mul(a16, -c0);
  1618.   m2 = mad_f_mul(a15, -c4);
  1619.   m3 = mad_f_mul(a14, -c1);
  1620.   m4 = mad_f_mul(a5,  -c1);
  1621.   m5 = mad_f_mul(a11, -c6);
  1622.   m6 = mad_f_mul(a10, -c5);
  1623.   m7 = mad_f_mul(a9,  -c2);
  1624.  
  1625.   a18 =     x[4] + a4;
  1626.   a19 = 2 * x[4] - a4;
  1627.   a20 = a19 + m5;
  1628.   a21 = a19 - m5;
  1629.   a22 = a19 + m6;
  1630.   a23 = m4  + m2;
  1631.   a24 = m4  - m2;
  1632.   a25 = m4  + m1;
  1633.  
  1634.   /* output to every other slot for convenience */
  1635.  
  1636.   y[ 0] = a18 + a12;
  1637.   y[ 2] = m0  - a25;
  1638.   y[ 4] = m7  - a20;
  1639.   y[ 6] = m3;
  1640.   y[ 8] = a21 - m6;
  1641.   y[10] = a24 - m1;
  1642.   y[12] = a12 - 2 * a18;
  1643.   y[14] = a23 + m0;
  1644.   y[16] = a22 + m7;
  1645. }
  1646.  
  1647. static inline
  1648. void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18])
  1649. {
  1650.   mad_fixed_t tmp[9];
  1651.   int i;
  1652.  
  1653.   /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */
  1654.   static mad_fixed_t const scale[9] = {
  1655.     MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930),
  1656.     MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8),
  1657.     MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7)
  1658.   };
  1659.  
  1660.   /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
  1661.  
  1662.   /* even input butterfly */
  1663.  
  1664.   for (i = 0; i < 9; i += 3) {
  1665.     tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1];
  1666.     tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1];
  1667.     tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1];
  1668.   }
  1669.  
  1670.   fastsdct(tmp, &X[0]);
  1671.  
  1672.   /* odd input butterfly and scaling */
  1673.  
  1674.   for (i = 0; i < 9; i += 3) {
  1675.     tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]);
  1676.     tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]);
  1677.     tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]);
  1678.   }
  1679.  
  1680.   fastsdct(tmp, &X[1]);
  1681.  
  1682.   /* output accumulation */
  1683.  
  1684.   for (i = 3; i < 18; i += 8) {
  1685.     X[i + 0] -= X[(i + 0) - 2];
  1686.     X[i + 2] -= X[(i + 2) - 2];
  1687.     X[i + 4] -= X[(i + 4) - 2];
  1688.     X[i + 6] -= X[(i + 6) - 2];
  1689.   }
  1690. }
  1691.  
  1692. static inline
  1693. void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18])
  1694. {
  1695.   mad_fixed_t tmp[18];
  1696.   int i;
  1697.  
  1698.   /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */
  1699.   static mad_fixed_t const scale[18] = {
  1700.     MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120),
  1701.     MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b),
  1702.     MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4),
  1703.     MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3),
  1704.     MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5),
  1705.     MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c)
  1706.   };
  1707.  
  1708.   /* scaling */
  1709.  
  1710.   for (i = 0; i < 18; i += 3) {
  1711.     tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]);
  1712.     tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]);
  1713.     tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]);
  1714.   }
  1715.  
  1716.   /* SDCT-II */
  1717.  
  1718.   sdctII(tmp, X);
  1719.  
  1720.   /* scale reduction and output accumulation */
  1721.  
  1722.   X[0] /= 2;
  1723.   for (i = 1; i < 17; i += 4) {
  1724.     X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1];
  1725.     X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1];
  1726.     X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1];
  1727.     X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1];
  1728.   }
  1729.   X[17] = X[17] / 2 - X[16];
  1730. }
  1731.  
  1732. /*
  1733.  * NAME:    imdct36
  1734.  * DESCRIPTION:    perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
  1735.  */
  1736. static inline
  1737. void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36])
  1738. {
  1739.   mad_fixed_t tmp[18];
  1740.   int i;
  1741.  
  1742.   /* DCT-IV */
  1743.  
  1744.   dctIV(x, tmp);
  1745.  
  1746.   /* convert 18-point DCT-IV to 36-point IMDCT */
  1747.  
  1748.   for (i =  0; i <  9; i += 3) {
  1749.     y[i + 0] =  tmp[9 + (i + 0)];
  1750.     y[i + 1] =  tmp[9 + (i + 1)];
  1751.     y[i + 2] =  tmp[9 + (i + 2)];
  1752.   }
  1753.   for (i =  9; i < 27; i += 3) {
  1754.     y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1];
  1755.     y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1];
  1756.     y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1];
  1757.   }
  1758.   for (i = 27; i < 36; i += 3) {
  1759.     y[i + 0] = -tmp[(i + 0) - 27];
  1760.     y[i + 1] = -tmp[(i + 1) - 27];
  1761.     y[i + 2] = -tmp[(i + 2) - 27];
  1762.   }
  1763. }
  1764. #  else
  1765. /*
  1766.  * NAME:    imdct36
  1767.  * DESCRIPTION:    perform X[18]->x[36] IMDCT
  1768.  */
  1769. static inline
  1770. void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36])
  1771. {
  1772.   mad_fixed_t t0, t1, t2,  t3,  t4,  t5,  t6,  t7;
  1773.   mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15;
  1774.   register mad_fixed64hi_t hi;
  1775.   register mad_fixed64lo_t lo;
  1776.  
  1777.   MAD_F_ML0(hi, lo, X[4],  MAD_F(0x0ec835e8));
  1778.   MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa));
  1779.  
  1780.   t6 = MAD_F_MLZ(hi, lo);
  1781.  
  1782.   MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa));
  1783.   MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8));
  1784.  
  1785.   t0 = MAD_F_MLZ(hi, lo);
  1786.  
  1787.   MAD_F_MLA(hi, lo, (t8  = X[0] - X[11] - X[12]),  MAD_F(0x0216a2a2));
  1788.   MAD_F_MLA(hi, lo, (t9  = X[2] - X[9]  - X[14]),  MAD_F(0x09bd7ca0));
  1789.   MAD_F_MLA(hi, lo, (t10 = X[3] - X[8]  - X[15]), -MAD_F(0x0cb19346));
  1790.   MAD_F_MLA(hi, lo, (t11 = X[5] - X[6]  - X[17]), -MAD_F(0x0fdcf549));
  1791.  
  1792.   x[7]  = MAD_F_MLZ(hi, lo);
  1793.   x[10] = -x[7];
  1794.  
  1795.   MAD_F_ML0(hi, lo, t8,  -MAD_F(0x0cb19346));
  1796.   MAD_F_MLA(hi, lo, t9,   MAD_F(0x0fdcf549));
  1797.   MAD_F_MLA(hi, lo, t10,  MAD_F(0x0216a2a2));
  1798.   MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0));
  1799.  
  1800.   x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0;
  1801.  
  1802.   t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15];
  1803.   t13 = X[2] + X[5] - X[6] - X[9]  - X[14] - X[17];
  1804.  
  1805.   MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8));
  1806.   MAD_F_MLA(hi, lo, t13,  MAD_F(0x061f78aa));
  1807.  
  1808.   x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0;
  1809.  
  1810.   MAD_F_ML0(hi, lo, X[1],  -MAD_F(0x09bd7ca0));
  1811.   MAD_F_MLA(hi, lo, X[7],   MAD_F(0x0216a2a2));
  1812.   MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549));
  1813.   MAD_F_MLA(hi, lo, X[16],  MAD_F(0x0cb19346));
  1814.  
  1815.   t1 = MAD_F_MLZ(hi, lo) + t6;
  1816.  
  1817.   MAD_F_ML0(hi, lo, X[0],   MAD_F(0x03768962));
  1818.   MAD_F_MLA(hi, lo, X[2],   MAD_F(0x0e313245));
  1819.   MAD_F_MLA(hi, lo, X[3],  -MAD_F(0x0ffc19fd));
  1820.   MAD_F_MLA(hi, lo, X[5],  -MAD_F(0x0acf37ad));
  1821.   MAD_F_MLA(hi, lo, X[6],   MAD_F(0x04cfb0e2));
  1822.   MAD_F_MLA(hi, lo, X[8],  -MAD_F(0x0898c779));
  1823.   MAD_F_MLA(hi, lo, X[9],   MAD_F(0x0d7e8807));
  1824.   MAD_F_MLA(hi, lo, X[11],  MAD_F(0x0f426cb5));
  1825.   MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352));
  1826.   MAD_F_MLA(hi, lo, X[14],  MAD_F(0x00b2aa3e));
  1827.   MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284));
  1828.   MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890));
  1829.  
  1830.   x[6]  = MAD_F_MLZ(hi, lo) + t1;
  1831.   x[11] = -x[6];
  1832.  
  1833.   MAD_F_ML0(hi, lo, X[0],  -MAD_F(0x0f426cb5));
  1834.   MAD_F_MLA(hi, lo, X[2],  -MAD_F(0x00b2aa3e));
  1835.   MAD_F_MLA(hi, lo, X[3],   MAD_F(0x0898c779));
  1836.   MAD_F_MLA(hi, lo, X[5],   MAD_F(0x0f9ee890));
  1837.   MAD_F_MLA(hi, lo, X[6],   MAD_F(0x0acf37ad));
  1838.   MAD_F_MLA(hi, lo, X[8],  -MAD_F(0x07635284));
  1839.   MAD_F_MLA(hi, lo, X[9],  -MAD_F(0x0e313245));
  1840.   MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352));
  1841.   MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962));
  1842.   MAD_F_MLA(hi, lo, X[14],  MAD_F(0x0d7e8807));
  1843.   MAD_F_MLA(hi, lo, X[15],  MAD_F(0x0ffc19fd));
  1844.   MAD_F_MLA(hi, lo, X[17],  MAD_F(0x04cfb0e2));
  1845.  
  1846.   x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1;
  1847.  
  1848.   MAD_F_ML0(hi, lo, X[0],  -MAD_F(0x0bcbe352));
  1849.   MAD_F_MLA(hi, lo, X[2],   MAD_F(0x0d7e8807));
  1850.   MAD_F_MLA(hi, lo, X[3],  -MAD_F(0x07635284));
  1851.   MAD_F_MLA(hi, lo, X[5],   MAD_F(0x04cfb0e2));
  1852.   MAD_F_MLA(hi, lo, X[6],   MAD_F(0x0f9ee890));
  1853.   MAD_F_MLA(hi, lo, X[8],  -MAD_F(0x0ffc19fd));
  1854.   MAD_F_MLA(hi, lo, X[9],  -MAD_F(0x00b2aa3e));
  1855.   MAD_F_MLA(hi, lo, X[11],  MAD_F(0x03768962));
  1856.   MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5));
  1857.   MAD_F_MLA(hi, lo, X[14],  MAD_F(0x0e313245));
  1858.   MAD_F_MLA(hi, lo, X[15],  MAD_F(0x0898c779));
  1859.   MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad));
  1860.  
  1861.   x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1;
  1862.  
  1863.   MAD_F_ML0(hi, lo, X[4],   MAD_F(0x061f78aa));
  1864.   MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8));
  1865.  
  1866.   t7 = MAD_F_MLZ(hi, lo);
  1867.  
  1868.   MAD_F_MLA(hi, lo, X[1],  -MAD_F(0x0cb19346));
  1869.   MAD_F_MLA(hi, lo, X[7],   MAD_F(0x0fdcf549));
  1870.   MAD_F_MLA(hi, lo, X[10],  MAD_F(0x0216a2a2));
  1871.   MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0));
  1872.  
  1873.   t2 = MAD_F_MLZ(hi, lo);
  1874.  
  1875.   MAD_F_MLA(hi, lo, X[0],   MAD_F(0x04cfb0e2));
  1876.   MAD_F_MLA(hi, lo, X[2],   MAD_F(0x0ffc19fd));
  1877.   MAD_F_MLA(hi, lo, X[3],  -MAD_F(0x0d7e8807));
  1878.   MAD_F_MLA(hi, lo, X[5],   MAD_F(0x03768962));
  1879.   MAD_F_MLA(hi, lo, X[6],  -MAD_F(0x0bcbe352));
  1880.   MAD_F_MLA(hi, lo, X[8],  -MAD_F(0x0e313245));
  1881.   MAD_F_MLA(hi, lo, X[9],   MAD_F(0x07635284));
  1882.   MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad));
  1883.   MAD_F_MLA(hi, lo, X[12],  MAD_F(0x0f9ee890));
  1884.   MAD_F_MLA(hi, lo, X[14],  MAD_F(0x0898c779));
  1885.   MAD_F_MLA(hi, lo, X[15],  MAD_F(0x00b2aa3e));
  1886.   MAD_F_MLA(hi, lo, X[17],  MAD_F(0x0f426cb5));
  1887.  
  1888.   x[5]  = MAD_F_MLZ(hi, lo);
  1889.   x[12] = -x[5];
  1890.  
  1891.   MAD_F_ML0(hi, lo, X[0],   MAD_F(0x0acf37ad));
  1892.   MAD_F_MLA(hi, lo, X[2],  -MAD_F(0x0898c779));
  1893.   MAD_F_MLA(hi, lo, X[3],   MAD_F(0x0e313245));
  1894.   MAD_F_MLA(hi, lo, X[5],  -MAD_F(0x0f426cb5));
  1895.   MAD_F_MLA(hi, lo, X[6],  -MAD_F(0x03768962));
  1896.   MAD_F_MLA(hi, lo, X[8],   MAD_F(0x00b2aa3e));
  1897.   MAD_F_MLA(hi, lo, X[9],  -MAD_F(0x0ffc19fd));
  1898.   MAD_F_MLA(hi, lo, X[11],  MAD_F(0x0f9ee890));
  1899.   MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2));
  1900.   MAD_F_MLA(hi, lo, X[14],  MAD_F(0x07635284));
  1901.   MAD_F_MLA(hi, lo, X[15],  MAD_F(0x0d7e8807));
  1902.   MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352));
  1903.  
  1904.   x[0]  = MAD_F_MLZ(hi, lo) + t2;
  1905.   x[17] = -x[0];
  1906.  
  1907.   MAD_F_ML0(hi, lo, X[0],  -MAD_F(0x0f9ee890));
  1908.   MAD_F_MLA(hi, lo, X[2],  -MAD_F(0x07635284));
  1909.   MAD_F_MLA(hi, lo, X[3],  -MAD_F(0x00b2aa3e));
  1910.   MAD_F_MLA(hi, lo, X[5],   MAD_F(0x0bcbe352));
  1911.   MAD_F_MLA(hi, lo, X[6],   MAD_F(0x0f426cb5));
  1912.   MAD_F_MLA(hi, lo, X[8],   MAD_F(0x0d7e8807));
  1913.   MAD_F_MLA(hi, lo, X[9],   MAD_F(0x0898c779));
  1914.   MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2));
  1915.   MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad));
  1916.   MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd));
  1917.   MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245));
  1918.   MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962));
  1919.  
  1920.   x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2;
  1921.  
  1922.   MAD_F_ML0(hi, lo, X[1],  -MAD_F(0x0216a2a2));
  1923.   MAD_F_MLA(hi, lo, X[7],  -MAD_F(0x09bd7ca0));
  1924.   MAD_F_MLA(hi, lo, X[10],  MAD_F(0x0cb19346));
  1925.   MAD_F_MLA(hi, lo, X[16],  MAD_F(0x0fdcf549));
  1926.  
  1927.   t3 = MAD_F_MLZ(hi, lo) + t7;
  1928.  
  1929.   MAD_F_ML0(hi, lo, X[0],   MAD_F(0x00b2aa3e));
  1930.   MAD_F_MLA(hi, lo, X[2],   MAD_F(0x03768962));
  1931.   MAD_F_MLA(hi, lo, X[3],  -MAD_F(0x04cfb0e2));
  1932.   MAD_F_MLA(hi, lo, X[5],  -MAD_F(0x07635284));
  1933.   MAD_F_MLA(hi, lo, X[6],   MAD_F(0x0898c779));
  1934.   MAD_F_MLA(hi, lo, X[8],   MAD_F(0x0acf37ad));
  1935.   MAD_F_MLA(hi, lo, X[9],  -MAD_F(0x0bcbe352));
  1936.   MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807));
  1937.   MAD_F_MLA(hi, lo, X[12],  MAD_F(0x0e313245));
  1938.   MAD_F_MLA(hi, lo, X[14],  MAD_F(0x0f426cb5));
  1939.   MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890));
  1940.   MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd));
  1941.  
  1942.   x[8] = MAD_F_MLZ(hi, lo) + t3;
  1943.   x[9] = -x[8];
  1944.  
  1945.   MAD_F_ML0(hi, lo, X[0],  -MAD_F(0x0e313245));
  1946.   MAD_F_MLA(hi, lo, X[2],   MAD_F(0x0bcbe352));
  1947.   MAD_F_MLA(hi, lo, X[3],   MAD_F(0x0f9ee890));
  1948.   MAD_F_MLA(hi, lo, X[5],  -MAD_F(0x0898c779));
  1949.   MAD_F_MLA(hi, lo, X[6],  -MAD_F(0x0ffc19fd));
  1950.   MAD_F_MLA(hi, lo, X[8],   MAD_F(0x04cfb0e2));
  1951.   MAD_F_MLA(hi, lo, X[9],   MAD_F(0x0f426cb5));
  1952.   MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e));
  1953.   MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807));
  1954.   MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962));
  1955.   MAD_F_MLA(hi, lo, X[15],  MAD_F(0x0acf37ad));
  1956.   MAD_F_MLA(hi, lo, X[17],  MAD_F(0x07635284));
  1957.  
  1958.   x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3;
  1959.  
  1960.   MAD_F_ML0(hi, lo, X[0],  -MAD_F(0x0d7e8807));
  1961.   MAD_F_MLA(hi, lo, X[2],   MAD_F(0x0f426cb5));
  1962.   MAD_F_MLA(hi, lo, X[3],   MAD_F(0x0acf37ad));
  1963.   MAD_F_MLA(hi, lo, X[5],  -MAD_F(0x0ffc19fd));
  1964.   MAD_F_MLA(hi, lo, X[6],  -MAD_F(0x07635284));
  1965.   MAD_F_MLA(hi, lo, X[8],   MAD_F(0x0f9ee890));
  1966.   MAD_F_MLA(hi, lo, X[9],   MAD_F(0x03768962));
  1967.   MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245));
  1968.   MAD_F_MLA(hi, lo, X[12],  MAD_F(0x00b2aa3e));
  1969.   MAD_F_MLA(hi, lo, X[14],  MAD_F(0x0bcbe352));
  1970.   MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2));
  1971.   MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779));
  1972.  
  1973.   x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3;
  1974.  
  1975.   MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8));
  1976.   MAD_F_MLA(hi, lo, t15,  MAD_F(0x061f78aa));
  1977.  
  1978.   t4 = MAD_F_MLZ(hi, lo) - t7;
  1979.  
  1980.   MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa));
  1981.   MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8));
  1982.  
  1983.   x[4]  = MAD_F_MLZ(hi, lo) + t4;
  1984.   x[13] = -x[4];
  1985.  
  1986.   MAD_F_ML0(hi, lo, t8,   MAD_F(0x09bd7ca0));
  1987.   MAD_F_MLA(hi, lo, t9,  -MAD_F(0x0216a2a2));
  1988.   MAD_F_MLA(hi, lo, t10,  MAD_F(0x0fdcf549));
  1989.   MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346));
  1990.  
  1991.   x[1]  = MAD_F_MLZ(hi, lo) + t4;
  1992.   x[16] = -x[1];
  1993.  
  1994.   MAD_F_ML0(hi, lo, t8,  -MAD_F(0x0fdcf549));
  1995.   MAD_F_MLA(hi, lo, t9,  -MAD_F(0x0cb19346));
  1996.   MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0));
  1997.   MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2));
  1998.  
  1999.   x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4;
  2000.  
  2001.   MAD_F_ML0(hi, lo, X[1],  -MAD_F(0x0fdcf549));
  2002.   MAD_F_MLA(hi, lo, X[7],  -MAD_F(0x0cb19346));
  2003.   MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0));
  2004.   MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2));
  2005.  
  2006.   t5 = MAD_F_MLZ(hi, lo) - t6;
  2007.  
  2008.   MAD_F_ML0(hi, lo, X[0],   MAD_F(0x0898c779));
  2009.   MAD_F_MLA(hi, lo, X[2],   MAD_F(0x04cfb0e2));
  2010.   MAD_F_MLA(hi, lo, X[3],   MAD_F(0x0bcbe352));
  2011.   MAD_F_MLA(hi, lo, X[5],   MAD_F(0x00b2aa3e));
  2012.   MAD_F_MLA(hi, lo, X[6],   MAD_F(0x0e313245));
  2013.   MAD_F_MLA(hi, lo, X[8],  -MAD_F(0x03768962));
  2014.   MAD_F_MLA(hi, lo, X[9],   MAD_F(0x0f9ee890));
  2015.   MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284));
  2016.   MAD_F_MLA(hi, lo, X[12],  MAD_F(0x0ffc19fd));
  2017.   MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad));
  2018.   MAD_F_MLA(hi, lo, X[15],  MAD_F(0x0f426cb5));
  2019.   MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807));
  2020.  
  2021.   x[2]  = MAD_F_MLZ(hi, lo) + t5;
  2022.   x[15] = -x[2];
  2023.  
  2024.   MAD_F_ML0(hi, lo, X[0],   MAD_F(0x07635284));
  2025.   MAD_F_MLA(hi, lo, X[2],   MAD_F(0x0acf37ad));
  2026.   MAD_F_MLA(hi, lo, X[3],   MAD_F(0x03768962));
  2027.   MAD_F_MLA(hi, lo, X[5],   MAD_F(0x0d7e8807));
  2028.   MAD_F_MLA(hi, lo, X[6],  -MAD_F(0x00b2aa3e));
  2029.   MAD_F_MLA(hi, lo, X[8],   MAD_F(0x0f426cb5));
  2030.   MAD_F_MLA(hi, lo, X[9],  -MAD_F(0x04cfb0e2));
  2031.   MAD_F_MLA(hi, lo, X[11],  MAD_F(0x0ffc19fd));
  2032.   MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779));
  2033.   MAD_F_MLA(hi, lo, X[14],  MAD_F(0x0f9ee890));
  2034.   MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352));
  2035.   MAD_F_MLA(hi, lo, X[17],  MAD_F(0x0e313245));
  2036.  
  2037.   x[3]  = MAD_F_MLZ(hi, lo) + t5;
  2038.   x[14] = -x[3];
  2039.  
  2040.   MAD_F_ML0(hi, lo, X[0],  -MAD_F(0x0ffc19fd));
  2041.   MAD_F_MLA(hi, lo, X[2],  -MAD_F(0x0f9ee890));
  2042.   MAD_F_MLA(hi, lo, X[3],  -MAD_F(0x0f426cb5));
  2043.   MAD_F_MLA(hi, lo, X[5],  -MAD_F(0x0e313245));
  2044.   MAD_F_MLA(hi, lo, X[6],  -MAD_F(0x0d7e8807));
  2045.   MAD_F_MLA(hi, lo, X[8],  -MAD_F(0x0bcbe352));
  2046.   MAD_F_MLA(hi, lo, X[9],  -MAD_F(0x0acf37ad));
  2047.   MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779));
  2048.   MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284));
  2049.   MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2));
  2050.   MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962));
  2051.   MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e));
  2052.  
  2053.   x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5;
  2054. }
  2055. #  endif
  2056.  
  2057. /*
  2058.  * NAME:    III_imdct_l()
  2059.  * DESCRIPTION:    perform IMDCT and windowing for long blocks
  2060.  */
  2061. static
  2062. void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36],
  2063.          unsigned int block_type)
  2064. {
  2065.   unsigned int i;
  2066.  
  2067.   /* IMDCT */
  2068.  
  2069.   imdct36(X, z);
  2070.  
  2071.   /* windowing */
  2072.  
  2073.   switch (block_type) {
  2074.   case 0:  /* normal window */
  2075. # if defined(ASO_INTERLEAVE1)
  2076.     {
  2077.       register mad_fixed_t tmp1, tmp2;
  2078.  
  2079.       tmp1 = window_l[0];
  2080.       tmp2 = window_l[1];
  2081.  
  2082.       for (i = 0; i < 34; i += 2) {
  2083.     z[i + 0] = mad_f_mul(z[i + 0], tmp1);
  2084.     tmp1 = window_l[i + 2];
  2085.     z[i + 1] = mad_f_mul(z[i + 1], tmp2);
  2086.     tmp2 = window_l[i + 3];
  2087.       }
  2088.  
  2089.       z[34] = mad_f_mul(z[34], tmp1);
  2090.       z[35] = mad_f_mul(z[35], tmp2);
  2091.     }
  2092. # elif defined(ASO_INTERLEAVE2)
  2093.     {
  2094.       register mad_fixed_t tmp1, tmp2;
  2095.  
  2096.       tmp1 = z[0];
  2097.       tmp2 = window_l[0];
  2098.  
  2099.       for (i = 0; i < 35; ++i) {
  2100.     z[i] = mad_f_mul(tmp1, tmp2);
  2101.     tmp1 = z[i + 1];
  2102.     tmp2 = window_l[i + 1];
  2103.       }
  2104.  
  2105.       z[35] = mad_f_mul(tmp1, tmp2);
  2106.     }
  2107. # elif 1
  2108.     for (i = 0; i < 36; i += 4) {
  2109.       z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
  2110.       z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
  2111.       z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
  2112.       z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]);
  2113.     }
  2114. # else
  2115.     for (i =  0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]);
  2116. # endif
  2117.     break;
  2118.  
  2119.   case 1:  /* start block */
  2120.     for (i =  0; i < 18; i += 3) {
  2121.       z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
  2122.       z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
  2123.       z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
  2124.     }
  2125.     /*  (i = 18; i < 24; ++i) z[i] unchanged */
  2126.     for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]);
  2127.     for (i = 30; i < 36; ++i) z[i] = 0;
  2128.     break;
  2129.  
  2130.   case 3:  /* stop block */
  2131.     for (i =  0; i <  6; ++i) z[i] = 0;
  2132.     for (i =  6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]);
  2133.     /*  (i = 12; i < 18; ++i) z[i] unchanged */
  2134.     for (i = 18; i < 36; i += 3) {
  2135.       z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
  2136.       z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
  2137.       z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
  2138.     }
  2139.     break;
  2140.   }
  2141. }
  2142. # endif  /* ASO_IMDCT */
  2143.  
  2144. /*
  2145.  * NAME:    III_imdct_s()
  2146.  * DESCRIPTION:    perform IMDCT and windowing for short blocks
  2147.  */
  2148. static
  2149. void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36])
  2150. {
  2151.   mad_fixed_t y[36], *yptr;
  2152.   mad_fixed_t const *wptr;
  2153.   int w, i;
  2154.   register mad_fixed64hi_t hi;
  2155.   register mad_fixed64lo_t lo;
  2156.  
  2157.   /* IMDCT */
  2158.  
  2159.   yptr = &y[0];
  2160.  
  2161.   for (w = 0; w < 3; ++w) {
  2162.     register mad_fixed_t const (*s)[6];
  2163.  
  2164.     s = imdct_s;
  2165.  
  2166.     for (i = 0; i < 3; ++i) {
  2167.       MAD_F_ML0(hi, lo, X[0], (*s)[0]);
  2168.       MAD_F_MLA(hi, lo, X[1], (*s)[1]);
  2169.       MAD_F_MLA(hi, lo, X[2], (*s)[2]);
  2170.       MAD_F_MLA(hi, lo, X[3], (*s)[3]);
  2171.       MAD_F_MLA(hi, lo, X[4], (*s)[4]);
  2172.       MAD_F_MLA(hi, lo, X[5], (*s)[5]);
  2173.  
  2174.       yptr[i + 0] = MAD_F_MLZ(hi, lo);
  2175.       yptr[5 - i] = -yptr[i + 0];
  2176.  
  2177.       ++s;
  2178.  
  2179.       MAD_F_ML0(hi, lo, X[0], (*s)[0]);
  2180.       MAD_F_MLA(hi, lo, X[1], (*s)[1]);
  2181.       MAD_F_MLA(hi, lo, X[2], (*s)[2]);
  2182.       MAD_F_MLA(hi, lo, X[3], (*s)[3]);
  2183.       MAD_F_MLA(hi, lo, X[4], (*s)[4]);
  2184.       MAD_F_MLA(hi, lo, X[5], (*s)[5]);
  2185.  
  2186.       yptr[ i + 6] = MAD_F_MLZ(hi, lo);
  2187.       yptr[11 - i] = yptr[i + 6];
  2188.  
  2189.       ++s;
  2190.     }
  2191.  
  2192.     yptr += 12;
  2193.     X    += 6;
  2194.   }
  2195.  
  2196.   /* windowing, overlapping and concatenation */
  2197.  
  2198.   yptr = &y[0];
  2199.   wptr = &window_s[0];
  2200.  
  2201.   for (i = 0; i < 6; ++i) {
  2202.     z[i +  0] = 0;
  2203.     z[i +  6] = mad_f_mul(yptr[ 0 + 0], wptr[0]);
  2204.  
  2205.     MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]);
  2206.     MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]);
  2207.  
  2208.     z[i + 12] = MAD_F_MLZ(hi, lo);
  2209.  
  2210.     MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]);
  2211.     MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]);
  2212.  
  2213.     z[i + 18] = MAD_F_MLZ(hi, lo);
  2214.  
  2215.     z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]);
  2216.     z[i + 30] = 0;
  2217.  
  2218.     ++yptr;
  2219.     ++wptr;
  2220.   }
  2221. }
  2222.  
  2223. /*
  2224.  * NAME:    III_overlap()
  2225.  * DESCRIPTION:    perform overlap-add of windowed IMDCT outputs
  2226.  */
  2227. static
  2228. void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18],
  2229.          mad_fixed_t sample[18][32], unsigned int sb)
  2230. {
  2231.   unsigned int i;
  2232.  
  2233. # if defined(ASO_INTERLEAVE2)
  2234.   {
  2235.     register mad_fixed_t tmp1, tmp2;
  2236.  
  2237.     tmp1 = overlap[0];
  2238.     tmp2 = overlap[1];
  2239.  
  2240.     for (i = 0; i < 16; i += 2) {
  2241.       sample[i + 0][sb] = output[i + 0 +  0] + tmp1;
  2242.       overlap[i + 0]    = output[i + 0 + 18];
  2243.       tmp1 = overlap[i + 2];
  2244.  
  2245.       sample[i + 1][sb] = output[i + 1 +  0] + tmp2;
  2246.       overlap[i + 1]    = output[i + 1 + 18];
  2247.       tmp2 = overlap[i + 3];
  2248.     }
  2249.  
  2250.     sample[16][sb] = output[16 +  0] + tmp1;
  2251.     overlap[16]    = output[16 + 18];
  2252.     sample[17][sb] = output[17 +  0] + tmp2;
  2253.     overlap[17]    = output[17 + 18];
  2254.   }
  2255. # elif 0
  2256.   for (i = 0; i < 18; i += 2) {
  2257.     sample[i + 0][sb] = output[i + 0 +  0] + overlap[i + 0];
  2258.     overlap[i + 0]    = output[i + 0 + 18];
  2259.  
  2260.     sample[i + 1][sb] = output[i + 1 +  0] + overlap[i + 1];
  2261.     overlap[i + 1]    = output[i + 1 + 18];
  2262.   }
  2263. # else
  2264.   for (i = 0; i < 18; ++i) {
  2265.     sample[i][sb] = output[i +  0] + overlap[i];
  2266.     overlap[i]    = output[i + 18];
  2267.   }
  2268. # endif
  2269. }
  2270.  
  2271. /*
  2272.  * NAME:    III_overlap_z()
  2273.  * DESCRIPTION:    perform "overlap-add" of zero IMDCT outputs
  2274.  */
  2275. static inline
  2276. void III_overlap_z(mad_fixed_t overlap[18],
  2277.            mad_fixed_t sample[18][32], unsigned int sb)
  2278. {
  2279.   unsigned int i;
  2280.  
  2281. # if defined(ASO_INTERLEAVE2)
  2282.   {
  2283.     register mad_fixed_t tmp1, tmp2;
  2284.  
  2285.     tmp1 = overlap[0];
  2286.     tmp2 = overlap[1];
  2287.  
  2288.     for (i = 0; i < 16; i += 2) {
  2289.       sample[i + 0][sb] = tmp1;
  2290.       overlap[i + 0]    = 0;
  2291.       tmp1 = overlap[i + 2];
  2292.  
  2293.       sample[i + 1][sb] = tmp2;
  2294.       overlap[i + 1]    = 0;
  2295.       tmp2 = overlap[i + 3];
  2296.     }
  2297.  
  2298.     sample[16][sb] = tmp1;
  2299.     overlap[16]    = 0;
  2300.     sample[17][sb] = tmp2;
  2301.     overlap[17]    = 0;
  2302.   }
  2303. # else
  2304.   for (i = 0; i < 18; ++i) {
  2305.     sample[i][sb] = overlap[i];
  2306.     overlap[i]    = 0;
  2307.   }
  2308. # endif
  2309. }
  2310.  
  2311. /*
  2312.  * NAME:    III_freqinver()
  2313.  * DESCRIPTION:    perform subband frequency inversion for odd sample lines
  2314.  */
  2315. static
  2316. void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb)
  2317. {
  2318.   unsigned int i;
  2319.  
  2320. # if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2)
  2321.   {
  2322.     register mad_fixed_t tmp1, tmp2;
  2323.  
  2324.     tmp1 = sample[1][sb];
  2325.     tmp2 = sample[3][sb];
  2326.  
  2327.     for (i = 1; i < 13; i += 4) {
  2328.       sample[i + 0][sb] = -tmp1;
  2329.       tmp1 = sample[i + 4][sb];
  2330.       sample[i + 2][sb] = -tmp2;
  2331.       tmp2 = sample[i + 6][sb];
  2332.     }
  2333.  
  2334.     sample[13][sb] = -tmp1;
  2335.     tmp1 = sample[17][sb];
  2336.     sample[15][sb] = -tmp2;
  2337.     sample[17][sb] = -tmp1;
  2338.   }
  2339. # else
  2340.   for (i = 1; i < 18; i += 2)
  2341.     sample[i][sb] = -sample[i][sb];
  2342. # endif
  2343. }
  2344.  
  2345. /*
  2346.  * NAME:    III_decode()
  2347.  * DESCRIPTION:    decode frame main_data
  2348.  */
  2349. static
  2350. enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
  2351.               struct sideinfo *si, unsigned int nch)
  2352. {
  2353.   struct mad_header *header = &frame->header;
  2354.   unsigned int sfreqi, ngr, gr;
  2355.  
  2356.   {
  2357.     unsigned int sfreq;
  2358.  
  2359.     sfreq = header->samplerate;
  2360.     if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
  2361.       sfreq *= 2;
  2362.  
  2363.     /* 48000 => 0, 44100 => 1, 32000 => 2,
  2364.        24000 => 3, 22050 => 4, 16000 => 5 */
  2365.     sfreqi = ((sfreq >>  7) & 0x000f) +
  2366.              ((sfreq >> 15) & 0x0001) - 8;
  2367.  
  2368.     if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
  2369.       sfreqi += 3;
  2370.   }
  2371.  
  2372.   /* scalefactors, Huffman decoding, requantization */
  2373.  
  2374.   ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2;
  2375.  
  2376.   for (gr = 0; gr < ngr; ++gr) {
  2377.     struct granule *granule = &si->gr[gr];
  2378.     unsigned char const *sfbwidth[2];
  2379.     mad_fixed_t xr[2][576];
  2380.     unsigned int ch;
  2381.     enum mad_error error;
  2382.  
  2383.     for (ch = 0; ch < nch; ++ch) {
  2384.       struct channel *channel = &granule->ch[ch];
  2385.       unsigned int part2_length;
  2386.  
  2387.       sfbwidth[ch] = sfbwidth_table[sfreqi].l;
  2388.       if (channel->block_type == 2) {
  2389.     sfbwidth[ch] = (channel->flags & mixed_block_flag) ?
  2390.       sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
  2391.       }
  2392.  
  2393.       if (header->flags & MAD_FLAG_LSF_EXT) {
  2394.     part2_length = III_scalefactors_lsf(ptr, channel,
  2395.                         ch == 0 ? 0 : &si->gr[1].ch[1],
  2396.                         header->mode_extension);
  2397.       }
  2398.       else {
  2399.     part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch],
  2400.                     gr == 0 ? 0 : si->scfsi[ch]);
  2401.       }
  2402.  
  2403.       error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
  2404.       if (error)
  2405.     return error;
  2406.     }
  2407.  
  2408.     /* joint stereo processing */
  2409.  
  2410.     if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) {
  2411.       error = III_stereo(xr, granule, header, sfbwidth[0]);
  2412.       if (error)
  2413.     return error;
  2414.     }
  2415.  
  2416.     /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
  2417.  
  2418.     for (ch = 0; ch < nch; ++ch) {
  2419.       struct channel const *channel = &granule->ch[ch];
  2420.       mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr];
  2421.       unsigned int sb, l, i, sblimit;
  2422.       mad_fixed_t output[36];
  2423.  
  2424.       if (channel->block_type == 2) {
  2425.     III_reorder(xr[ch], channel, sfbwidth[ch]);
  2426.  
  2427. # if !defined(OPT_STRICT)
  2428.     /*
  2429.      * According to ISO/IEC 11172-3, "Alias reduction is not applied for
  2430.      * granules with block_type == 2 (short block)." However, other
  2431.      * sources suggest alias reduction should indeed be performed on the
  2432.      * lower two subbands of mixed blocks. Most other implementations do
  2433.      * this, so by default we will too.
  2434.      */
  2435.     if (channel->flags & mixed_block_flag)
  2436.       III_aliasreduce(xr[ch], 36);
  2437. # endif
  2438.       }
  2439.       else
  2440.     III_aliasreduce(xr[ch], 576);
  2441.  
  2442.       l = 0;
  2443.  
  2444.       /* subbands 0-1 */
  2445.  
  2446.       if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) {
  2447.     unsigned int block_type;
  2448.  
  2449.     block_type = channel->block_type;
  2450.     if (channel->flags & mixed_block_flag)
  2451.       block_type = 0;
  2452.  
  2453.     /* long blocks */
  2454.     for (sb = 0; sb < 2; ++sb, l += 18) {
  2455.       III_imdct_l(&xr[ch][l], output, block_type);
  2456.       III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
  2457.     }
  2458.       }
  2459.       else {
  2460.     /* short blocks */
  2461.     for (sb = 0; sb < 2; ++sb, l += 18) {
  2462.       III_imdct_s(&xr[ch][l], output);
  2463.       III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
  2464.     }
  2465.       }
  2466.  
  2467.       III_freqinver(sample, 1);
  2468.  
  2469.       /* (nonzero) subbands 2-31 */
  2470.  
  2471.       i = 576;
  2472.       while (i > 36 && xr[ch][i - 1] == 0)
  2473.     --i;
  2474.  
  2475.       sblimit = 32 - (576 - i) / 18;
  2476.  
  2477.       if (channel->block_type != 2) {
  2478.     /* long blocks */
  2479.     for (sb = 2; sb < sblimit; ++sb, l += 18) {
  2480.       III_imdct_l(&xr[ch][l], output, channel->block_type);
  2481.       III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
  2482.  
  2483.       if (sb & 1)
  2484.         III_freqinver(sample, sb);
  2485.     }
  2486.       }
  2487.       else {
  2488.     /* short blocks */
  2489.     for (sb = 2; sb < sblimit; ++sb, l += 18) {
  2490.       III_imdct_s(&xr[ch][l], output);
  2491.       III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
  2492.  
  2493.       if (sb & 1)
  2494.         III_freqinver(sample, sb);
  2495.     }
  2496.       }
  2497.  
  2498.       /* remaining (zero) subbands */
  2499.  
  2500.       for (sb = sblimit; sb < 32; ++sb) {
  2501.     III_overlap_z((*frame->overlap)[ch][sb], sample, sb);
  2502.  
  2503.     if (sb & 1)
  2504.       III_freqinver(sample, sb);
  2505.       }
  2506.     }
  2507.   }
  2508.  
  2509.   return MAD_ERROR_NONE;
  2510. }
  2511.  
  2512. /*
  2513.  * NAME:    layer->III()
  2514.  * DESCRIPTION:    decode a single Layer III frame
  2515.  */
  2516. int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
  2517. {
  2518.   struct mad_header *header = &frame->header;
  2519.   unsigned int nch, priv_bitlen, next_md_begin = 0;
  2520.   unsigned int si_len, data_bitlen, md_len;
  2521.   unsigned int frame_space, frame_used, frame_free;
  2522.   struct mad_bitptr ptr;
  2523.   struct sideinfo si;
  2524.   enum mad_error error;
  2525.   int result = 0;
  2526.  
  2527.   /* allocate Layer III dynamic structures */
  2528.  
  2529.   if (stream->main_data == 0) {
  2530.     stream->main_data = malloc(MAD_BUFFER_MDLEN);
  2531.     if (stream->main_data == 0) {
  2532.       stream->error = MAD_ERROR_NOMEM;
  2533.       return -1;
  2534.     }
  2535.   }
  2536.  
  2537.   if (frame->overlap == 0) {
  2538.     frame->overlap = calloc(2 * 32 * 18, sizeof(mad_fixed_t));
  2539.     if (frame->overlap == 0) {
  2540.       stream->error = MAD_ERROR_NOMEM;
  2541.       return -1;
  2542.     }
  2543.   }
  2544.  
  2545.   nch = MAD_NCHANNELS(header);
  2546.   si_len = (header->flags & MAD_FLAG_LSF_EXT) ?
  2547.     (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32);
  2548.  
  2549.   /* check frame sanity */
  2550.  
  2551.   if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) <
  2552.       (signed int) si_len) {
  2553.     stream->error = MAD_ERROR_BADFRAMELEN;
  2554.     stream->md_len = 0;
  2555.     return -1;
  2556.   }
  2557.  
  2558.   /* check CRC word */
  2559.  
  2560.   if (header->flags & MAD_FLAG_PROTECTION) {
  2561.     header->crc_check =
  2562.       mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check);
  2563.  
  2564.     if (header->crc_check != header->crc_target &&
  2565.     !(frame->options & MAD_OPTION_IGNORECRC)) {
  2566.       stream->error = MAD_ERROR_BADCRC;
  2567.       result = -1;
  2568.     }
  2569.   }
  2570.  
  2571.   /* decode frame side information */
  2572.  
  2573.   error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT,
  2574.                &si, &data_bitlen, &priv_bitlen);
  2575.   if (error && result == 0) {
  2576.     stream->error = error;
  2577.     result = -1;
  2578.   }
  2579.  
  2580.   header->flags        |= priv_bitlen;
  2581.   header->private_bits |= si.private_bits;
  2582.  
  2583.   /* find main_data of next frame */
  2584.  
  2585.   {
  2586.     struct mad_bitptr peek;
  2587.     unsigned long header;
  2588.  
  2589.     mad_bit_init(&peek, stream->next_frame);
  2590.  
  2591.     header = mad_bit_read(&peek, 32);
  2592.     if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) {
  2593.       if (!(header & 0x00010000L))  /* protection_bit */
  2594.     mad_bit_skip(&peek, 16);  /* crc_check */
  2595.  
  2596.       next_md_begin =
  2597.     mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8);
  2598.     }
  2599.  
  2600.     mad_bit_finish(&peek);
  2601.   }
  2602.  
  2603.   /* find main_data of this frame */
  2604.  
  2605.   frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr);
  2606.  
  2607.   if (next_md_begin > si.main_data_begin + frame_space)
  2608.     next_md_begin = 0;
  2609.  
  2610.   md_len = si.main_data_begin + frame_space - next_md_begin;
  2611.  
  2612.   frame_used = 0;
  2613.  
  2614.   if (si.main_data_begin == 0) {
  2615.     ptr = stream->ptr;
  2616.     stream->md_len = 0;
  2617.  
  2618.     frame_used = md_len;
  2619.   }
  2620.   else {
  2621.     if (si.main_data_begin > stream->md_len) {
  2622.       if (result == 0) {
  2623.     stream->error = MAD_ERROR_BADDATAPTR;
  2624.     result = -1;
  2625.       }
  2626.     }
  2627.     else {
  2628.       mad_bit_init(&ptr,
  2629.            *stream->main_data + stream->md_len - si.main_data_begin);
  2630.  
  2631.       if (md_len > si.main_data_begin) {
  2632.     assert(stream->md_len + md_len -
  2633.            si.main_data_begin <= MAD_BUFFER_MDLEN);
  2634.  
  2635.     bcopy(mad_bit_nextbyte(&stream->ptr),
  2636.            *stream->main_data + stream->md_len,
  2637.            frame_used = md_len - si.main_data_begin);
  2638.     stream->md_len += frame_used;
  2639.       }
  2640.     }
  2641.   }
  2642.  
  2643.   frame_free = frame_space - frame_used;
  2644.  
  2645.   /* decode main_data */
  2646.  
  2647.   if (result == 0) {
  2648.     error = III_decode(&ptr, frame, &si, nch);
  2649.     if (error) {
  2650.       stream->error = error;
  2651.       result = -1;
  2652.     }
  2653.  
  2654.     /* designate ancillary bits */
  2655.  
  2656.     stream->anc_ptr    = ptr;
  2657.     stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
  2658.   }
  2659.  
  2660. # if 0 && defined(DEBUG)
  2661.   fprintf(stderr,
  2662.       "main_data_begin:%u, md_len:%u, frame_free:%u, "
  2663.       "data_bitlen:%u, anc_bitlen: %u\n",
  2664.       si.main_data_begin, md_len, frame_free,
  2665.       data_bitlen, stream->anc_bitlen);
  2666. # endif
  2667.  
  2668.   /* preload main_data buffer with up to 511 bytes for next frame(s) */
  2669.  
  2670.   if (frame_free >= next_md_begin) {
  2671.     bcopy(stream->next_frame - next_md_begin,
  2672.        *stream->main_data, next_md_begin);
  2673.     stream->md_len = next_md_begin;
  2674.   }
  2675.   else {
  2676.     if (md_len < si.main_data_begin) {
  2677.       unsigned int extra;
  2678.  
  2679.       extra = si.main_data_begin - md_len;
  2680.       if (extra + frame_free > next_md_begin)
  2681.     extra = next_md_begin - frame_free;
  2682.  
  2683.       if (extra < stream->md_len) {
  2684.     bcopy(*stream->main_data + stream->md_len - extra,
  2685.         *stream->main_data, extra);
  2686.     stream->md_len = extra;
  2687.       }
  2688.     }
  2689.     else
  2690.       stream->md_len = 0;
  2691.  
  2692.     bcopy(stream->next_frame - frame_free,
  2693.        *stream->main_data + stream->md_len, frame_free);
  2694.     stream->md_len += frame_free;
  2695.   }
  2696.  
  2697.   return result;
  2698. }
  2699.